VS Code为Arduino提供的头文件出现错误?缺少官方头文件?

12

我最近开始开发Arduino项目。最初我使用了Arduino IDE,但很快意识到它的表现不够出色。需要不时重启IDE导致开发速度缓慢。之后我找到了带有Arduino扩展的VS Code,我喜欢上了它。然而,我遇到了一些问题,也不确定如何解决。

首先,VS Code会报告#include错误并要求我更新IntelliSense。然而,它可以构建/上传和运行得非常好,并找到在这些头文件中定义的类等等,因此看起来它是某种方式的虚警(即路径已包含在includePath设置中)。阅读错误消息还显示出了在Arduino.h中引用的标题“avr/pgmspace.h”出现问题。我不确定这些错误是否相关。pgmspace.h无处可寻(它应该已经包含在Arduino SDK中)。

最后,由于#include错误,任何与该特定头文件相关的内容都将无法正确突出显示,只是普通的灰色文本,有点恼人。

有人知道如何修复这个问题吗?顺便说一下,我用的是Mac。

错误消息

5个回答

15

更新: 不需要安装额外的库。IntelliSense可以仅使用由Arduino应用程序安装的头文件运行,但是其他一些库可能有所帮助。下面有更多更新。

在VSCode构建时,它使用SDK。但是,IntelliSense无法读取SDK文件以进行操作(据我所知),这会导致这些烦人的错误并消除大多数代码完成功能。

需要配置includePathbrowse.pathincludePath不会递归包含(但该功能似乎即将推出)。browse.path是递归的,但仍然需要在includePath中包含标头文件的确切位置以获得IntelliSense功能。 browse.path将使用标记解析器提供诸如可以单击的“指示灯”等工具来帮助解决您的includePath问题。(来源:c_cpp_properties.json中的“includePath”和“browse.path”之间有什么区别?


Mac:

avr/pgmspace.h位于:/Applications/Arduino.app/Contents/Java/hardware/tools/avr/avr/include/avr/pgmspace.h。它被编码到库中作为avr/pgmspace.h;因此,我们需要包含avr所在的路径。

1. 安装homebrew-avr:

2. 编辑c_cpp_properties.json:

"includePath": [
    "${workspaceFolder}/libraries",
    "/System/Library/Frameworks/Kernel.framework/Versions/A/Headers",
    "/Applications/Arduino.app/Contents/Java/libraries",
    "/Applications/Arduino.app/Contents/Java/hardware/tools/avr/avr/include",
    "/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/variants/standard"
],
"browse": {
    "limitSymbolsToIncludedHeaders": false,
    "path": [
        "/System/Library/Frameworks/Kernel.framework/Versions/A/Headers",
        "/Applications/Arduino.app/Contents/Java/"
    ]
},
"forcedInclude": [
    "/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h"
],

Windows 10:

1. 安装WinAVR

2. 编辑c_cpp_properties.json:

includePath修改为以下形式:

"includePath": [
    "{$workspaceFolder}/libraries",
    "C:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr/5.4.0/include",
    "C:/Program Files (x86)/Arduino/hardware/arduino/avr/cores/arduino",
    "C:/Program Files (x86)/Arduino/hardware/arduino/avr/variants/standard",
    "C:/Program Files (x86)/Arduino",
],

替代方法(可能不是一个好主意):

如果您可以获得任何缺失库的版本,且您的includePath包含"${workspaceFolder}/libraries",则可以将其放入项目的libraries文件夹中。请确保适当地命名您的库,例如libraries/avr/pgmspace.h。我没有测试过这种方法。


更新:

  • 从 home.path 更改为 includePath。详见:vscode-cpptools/FAQ
  • vscode-arduino 库下载的工具在 Windows 10 上不是必要的。
  • 将 Windows 配置路径更改为使用正斜杠而不是转义反斜杠。

源代码和更多提示:在 Visual Studio Code 中启用 Arduino 智能感知


不幸的是,这对我没有起作用。说实话,它似乎是一个 bug,因为它似乎没有遵守 includePaths。我将在 Github 上发布一个 bug 并报告是否解决了问题。 - sebrock
如果可以的话,请在这里分享那个问题线程。我也很感兴趣了解一下。 - Joe Sadoski
所以我已经解决了。不幸的是,我不确定是什么让它工作的。可能是多种因素的综合作用。我倾向于怀疑有多个智能感知引擎同时运行时发生了冲突。我的 VS Code 实例安装了两个智能感知扩展。现在我只运行官方的 C/C++ 扩展,似乎就可以解决问题了。无论如何,我还是会将你的答案标记为正确的。 - sebrock
谢谢,知道了。由于我已经开始使用其他库,我反复遇到一些不合理的问题。昨天,在一个项目中,IntelliSense为一个.io抛出错误,而在另一个项目中没有,我已经复制并粘贴了整个c_cpp_properties.json,并修复了有关相对文件路径的小细节。我的Serial()实例说它没有声明,但我可以右键单击并使用Go To/Peek definition,这将带我到头文件。整个系统似乎需要改进。如果Arduino.cc能够提供更好的库文档,我也会很感激。 - Joe Sadoski

6

对我来说,已接受的答案不起作用。找不到也无法创建c_cpp_properties.json文件。而且,我希望它是全局的,而不仅仅是一个项目/工作区/文件夹。

因此,在VSCode 1.14(2019)中,我只需导航到settings.json(全局设置),并添加以下json部分:

"C_Cpp.default.includePath": [
    "C:/Program Files (x86)/Arduino/libraries/**",
    "C:/Program Files (x86)/Arduino/hardware/arduino/avr/cores/arduino/**",
    "C:/Program Files (x86)/Arduino/hardware/tools/avr/avr/include/**",
    "C:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr/5.4.0/include/**",
    "C:/Program Files (x86)/Arduino/hardware/arduino/avr/variants/standard/**",
    "C:/Users/<YOUR USERNAME>/.platformio/packages/framework-arduinoavr/**",
    "C:/Users/<YOUR USERNAME>/Documents/Arduino/libraries/**",
    "{$workspaceFolder}/libraries/**",
    "{$workspaceFolder}/**"
],
"C_Cpp.intelliSenseEngine": "Tag Parser"

我已经发布了另一个答案,其中包含整个过程以及关于此方法的所有细节:Visual Studio Code includePath


不确定你是如何“无法创建”文件的。这是你的文件系统 :) 但很高兴你已经解决了它。 - sebrock
@sebrock 我的意思是我找不到任何自动创建该文件的选项,就像其他解决方案(不在此问题中)所建议的那样。有一个教程说:“点击错误。这将为您创建c_cpp_properties.json文件。”但我根本找不到那个选项,也不知道在哪里创建该文件,以及它应该是什么格式/结构(包括哪些属性、值等)。 - Vitox
@sebrock 所以...当然,我可以在任何地方创建一个 .json 文件呵呵。但是我并不知道应该在哪里创建它,以及它应该具有什么属性和值。无论如何,我的解决方案似乎更简单,并且完成了工作。:) - Vitox

1
我正在使用VSC作为代码编辑器,只需要智能感知功能。在Arduino IDE首选项中设置了"use external editor",并将其用于编译和上传。我的Windows用户名是"bunny",Sketchbook位置为"C:\person\Arduino",以便了解文件夹。我正在使用最新的VSC(1.56.2)和Arduino IDE(1.8.13)。我的settings.json如下所示,可以很好地处理所有库,特别是esp8266等:
{
"C_Cpp.intelliSenseEngine": "Tag Parser",
    "C_Cpp.default.browse.path": [
        "c:/Person/Arduino/libraries",
        "c:/Person/Arduino/hardware",
        "c:/Program Files (x86)/Arduino/hardware",
        "c:/Program Files (x86)/Arduino/libraries",
        "c:/Users/Bunny/AppData/Local/Arduino15/packages",
        "${workspaceFolder}"
    ]
}

没有其他答案有效,但这个有效了(VSC 1.70.0,Arduino 1.8.13)。我只需要包含"${workspaceFolder}",因为vs code(IntelliSense)只是对我的项目中的包含文件感到困惑。谢谢! - Chris Torrence

1

被接受的答案非常好。我不得不包含一些其他的文件夹,我的includePath看起来像这样,我再也没有IntelliSense错误了:

"includePath": [
                "${workspaceFolder}/**",
                "C:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr/7.3.0/include",
                "C:/Program Files (x86)/Arduino/hardware/arduino/avr/cores/arduino",
                "C:/Program Files (x86)/Arduino/hardware/arduino/avr/variants/standard",
                "C:/Users/<USER_NAME>/Documents/Arduino/libraries/**",
                "C:/Users/<USER_NAME>/AppData/Local/Arduino15/packages/arduino/hardware/avr/1.8.5/libraries/**",
                "C:/Users/<USER_NAME>/AppData/Local/Arduino15/libraries/**"
            ],

如果遇到找不到的头文件(例如SPI.hEthernet.h),你可以使用这些路径作为参考来添加。


0

c_cpp_properties.json 文件位于项目的 .vscode 目录中。

如果不存在,您可以通过在 VSCode 中按下 Ctrl+Shift+P 并输入 C/C++: Edit Configurations (JSON) 命令来创建它。

为了改进 Stefan 的答案,您可以使用 ${env:USERNAME} 替换 <USER_NAME>,以使其自动替换为当前用户的名称。

这些对我起作用:

"includePath": [
    "${workspaceFolder}/**",
    "C:/Program Files (x86)/Arduino/**",
    "C:/Program Files (x86)/Arduino/hardware/tools/avr/lib/gcc/avr/7.3.0/include",
    "C:/Program Files (x86)/Arduino/hardware/arduino/avr/cores/arduino",
    "C:/Program Files (x86)/Arduino/hardware/arduino/avr/variants/standard",
    "C:/Users/${env:USERNAME}/Documents/Arduino/libraries/**",
    "C:/Users/${env:USERNAME}/AppData/Local/Arduino15/packages/**",
    "C:/Users/${env:USERNAME}/Documents/Arduino/libraries/Adafruit_GFX_Library/",
    "C:/Program Files (x86)/Arduino/hardware/arduino/avr/libraries/SPI/src"         
],

这也很有用,可以像naigonakoii在这里建议的那样将编译器更改为gcc:

"compilerPath": "C:/Program Files (x86)/Arduino/hardware/tools/avr/bin/avr-gcc.exe",
"intelliSenseMode": "gcc-x86",

通过添加一些定义,我们可以得到最终的抗抖动线配置(您可能需要根据您使用的模型更改最后一个定义)

"defines": [
    "_DEBUG",
    "UNICODE",
    "_UNICODE",
    "ARDUINO=100",
    "USBCON",
    "__AVR_ATmega328P__"
],

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接