Visual Studio Code,#include <stdio.h> 提示“将包含路径添加到设置中”

106

我正在尝试在Visual Studio Code中构建C/C++。我已安装了C/C++及所有相关插件。

#include <stdio.h>
int main() {
    printf("Test C now\n");
    return 0;
}

但是在#include <stdio.h>下面有一条绿色的线,上面写着“添加包含路径到设置”。当我点击它时,它会移动到“c_cpp_properties.json”。

在下面的配置中,我应该在哪里以及如何添加包含路径?

"configurations": [
    {
        "name": "Mac",
        "includePath": ["/usr/include"]
    }
]

顺便提一下,在C++中,你通常应该更喜欢使用#include <cstdio> - undefined
14个回答

74
对情况的更现代看法。在2018年,C++扩展为文件的compilerPath配置添加了另一个选项;

compilerPath(可选) 您用于构建项目的编译器的绝对路径。扩展将查询编译器以确定用于IntelliSense的系统包含路径和默认定义。

如果使用了compilerPath,则可能不需要includePath,因为IntelliSense将使用编译器来确定系统包含路径。


原本,

在下面的配置中,我应该如何在哪里添加包含路径?

由于列表是一个字符串数组,因此添加包含路径的方式可能如下所示;

"configurations": [
    {
        "name": "Mac",
        "includePath": ["/usr/local/include",
            "/path/to/additional/includes",
            "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include"
        ]
    }
]

来源:cpptools博客2016年3月31日

链接的来源展示了Win32配置的格式,但其他配置也适用。

以上示例包括了SDK(OSX 10.11)路径,如果已安装Xcode

注意,一旦包含路径被更改,更新可能需要一些时间。

可以在此处找到cpptools扩展

有关VSCode中C++语言支持的更多文档(来自Microsoft)可以在此处找到


为了保存(从讨论中),以下是用于编译和执行C++文件或C文件的tasks.json文件内容的基本片段。它们允许文件名中包含空格(需要在json中使用\"转义额外的引号)。shell被用作运行程序,因此可以进行编译(clang...)和执行(&& ./a.out)程序。它还假设tasks.json文件位于本地工作区(在.vscode目录下)。更多关于tasks.json的详细信息,如支持的变量等,可以在这里找到。
{ 
    "version": "0.1.0", 
    "isShellCommand": true, 
    "taskName": "GenericBuild", 
    "showOutput": "always", 
    "command": "sh", 
    "suppressTaskName": false, 
    "args": ["-c", "clang++ -std=c++14 -Wall -Wextra -pedantic -pthread \"${file}\" && ./a.out"]
}

对于C语言;
{ 
    "version": "0.1.0", 
    "isShellCommand": true, 
    "taskName": "GenericBuild", 
    "showOutput": "always", 
    "command": "sh", 
    "suppressTaskName": false, 
    "args": ["-c", "clang -std=c11 -Wall -Wextra -pedantic -pthread \"${file}\" && ./a.out"] // command arguments... 
}

5
我只想补充一下,我在这里找到了创建c_cpp_properties.json、tasks.json和launch.json文件的说明 https://code.visualstudio.com/docs/languages/cpp - agwntr
3
请记住,您可以使用 /** 进行递归包含:"includePath":[ "C:/path/to/all/includes/**" ] - Danijel
1
在较新版本的C/C++扩展中,建议使用compilerPath属性来设置系统包含/定义,而不是将它们添加到includePath属性中。 - Bob Brown
1
@Wyck。它是c_cpp_properties.json文件对象的一个属性。 - Niall
1
@arkady。这是c_cpp_properties文件的一部分。如果它没有被生成,您可以自己创建一个。请参阅此处以获取更多详细信息https://code.visualstudio.com/docs/cpp/c-cpp-properties-schema-reference - Niall
显示剩余11条评论

58

针对在Google上遇到问题的用户,这里提供了VSCode 1.40(2019年版)的解决方案:

打开全局settings.json文件:文件>首选项>设置

打开全局 settings.json 文件:文件 > 首选项 > 设置

然后选择“User”选项卡,打开“扩展”部分,点击“C/C++”。接下来滚动右侧面板,找到“Edit in settings.json”按钮。

然后选择“User”选项卡,打开“扩展”部分,点击“C/C++”。接下来滚动右侧面板,找到“Edit in settings.json”按钮。

最后,添加“C_Cpp.default.includePath”部分。提供的代码来自我的系统(Windows 7)。您可以将其用作自己库路径的基础。(请记得将YOUR USERNAME更改为正确的系统(我使用的是windows)用户名)
(编辑信息:我的方法递归有问题,VSCode不允许同一事物有多个定义。我通过"C_Cpp.intelliSenseEngine": "Tag Parser"解决了这个问题。)

最后,您需要添加“C_Cpp.default.includePath”部分。提供的代码来自我的系统(Windows 7)。您可以将其用作自己库路径的基础。(请记得将 YOUR USERNAME 更改为正确的系统(我使用的是windows)用户名)

在第7行之前的代码与Arduino或includePath无关。请不要复制那部分代码...

要添加到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"

1
在我的情况下,这并没有消除 #include <mysql.h> 的下划线,需要将 settings.json 更改为: "C_Cpp.default.includePath": ["C:\\Program Files\\MariaDB\\MariaDB Connector C 64-bit\\include\\**"] - questionto42
嗨@Vitox,是的,路径是正确的,它是一个外部安装的mariadb连接器。斜杠与Windows上的\相同(\是转义字符,因此我需要转义\才能看到它)。这绝对有效。当我改变了c_cpp_properties.json中的includePath时,linting就消失了(其他答案)。我在这里记录了这个过程:https://dev59.com/c3I-5IYBdhLWcg3wKVE9#61783463 也许这也是一个特殊情况?因为如果不将包含和库路径添加为参数,它无论如何都无法编译,无论有没有linting。 - questionto42
1
@Vitox:谢谢。值得注意的是,我首先添加了我的包含目录,没有添加最后一行“"C_Cpp.intelliSenseEngine": "Tag Parser"”,但是它没有起作用。添加后,它运行得很好。 - trozzel
1
截至v1.55.2(2021-04-13),对我来说属性“C_Cpp.default.includePath”似乎不存在。 - coincoin
1
为什么你使用的是 {$workspaceFolder} 而不是 ${workspaceFolder} - Voyager
显示剩余2条评论

18

如果您是Mac用户,只安装了命令行工具而没有安装Xcode,请检查/Library/Developer/CommandLineTools目录,例如:

"configurations": [{
    "name": "Mac",
    "includePath": [
            "/usr/local/include",
            // others, e.g.: "/usr/local/opt/ncurses/include",
            "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include",
            "${workspaceFolder}/**"
    ]
}]

如果您安装了不同版本的命令行工具,则可能需要调整路径。

注意:您也可以通过命令面板(⇧⌘P)中的C/Cpp: Edit Configurations命令打开/生成c_cpp_properties.json文件。


在当前的c_cpp_properties.json文件中,文件顶部声明: "!!! 警告 !!!": "请勿修改此文件!使用https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags"我也确认过,当向该文件添加引用时,它们可能会被删除。 - Paul Allsopp

11
在您的用户设置中添加:
"C_Cpp.default.includePath":["path1","path2"]

3
这个方法结合其他答案提供的路径,再加上一个 '' 放在末尾,就可以解决问题了!比如: "C_Cpp.default.includePath": [ "C:/Users/Administrator/Documents/Arduino/libraries/" ] - Vitox
@Votox 这才是真正的答案! - degski
对于我自己的Mac电脑,我必须准确地指定头文件的位置,不能用*来封装整个文件夹。例如,我有一个需要的头文件;我必须为VSCode指定头文件所在的文件夹才能找到它:"C_Cpp.default.includePath":[ "/Users/Github/Learning/Cpp_repo/FreeStore/header/" - kevin_theinfinityfund

4
这个回答可能有点晚,但我刚好解决了这个问题。以下是我的c_cpp_properties.json文件:
{
"configurations": [
    {
        "name": "Linux",
        "includePath": [
            "${workspaceFolder}/**",                
            "/usr/include/c++/5.4.0/",
            "usr/local/include/",
            "usr/include/"
        ],
        "defines": [],
        "compilerPath": "/usr/bin/gcc",
        "cStandard": "c11",
        "cppStandard": "c++14",
        "intelliSenseMode": "clang-x64"
    }
],
"version": 4

}


compilerPath 是正确的选择。您应该从 includePath 属性中删除系统包含路径。 - Bob Brown
这个文件在磁盘上的哪个位置? - Marc.2377
@Bob Brown:我还没有通过compilerPath解决它,而且我根本不知道应该如何使用它。我在Windows上使用MinGW,compilerPath需要mingw,并且是一个单独的字符串。官方文档只提到了c_cpp_configurations.json中的includePath: 如果您的程序包含不在工作区或标准库路径中的头文件,则只需添加到Include path数组设置中即可。 参见:https://code.visualstudio.com/docs/cpp/config-msvc 所以为什么这个答案被认为是无用的,更多是因为它重复了上面的答案,但它仍然是正确的。 - questionto42

3
配置项目的标准头文件最佳方法是将compilerPath属性设置为c_cpp_properties.json文件中的配置。不建议将系统包含路径添加到includePath属性中。
如果不想使用c_cpp_properties.json,另一种选择是设置C_Cpp.default.compilerPath设置项。

是否存在一个全局的 c_cpp_properties.json 文件?我记得以前有一个,位于 ~/.vscode/ 或者 ~/.vscode-oss/(在 Linux 上);但现在我找不到了。 - Marc.2377
1
不,没有全局的 c_cpp_properties.json 文件。不过,您可以使用 C_Cpp.default.* 设置来实现类似的效果。 - Bob Brown
我认为这个答案使用了一种令人困惑的表达方式,也许只是我的英语不好?我发现这个更容易理解,这里复制@Bob Brown在https://dev59.com/YFoU5IYBdhLWcg3wYWOx中的评论:“在较新版本的C/C++扩展中,建议使用compilerPath属性来设置系统包含/定义,而不是将它们添加到includePath属性中。” - questionto42

2
我通过卸载最近安装的Visual Studio解决了这个问题。

这就是你的完整解决方案吗?你用了什么替代方案? - Michael Nelles
是的。我曾经在 Visual Studio Code 上安装了 Visual Studio,这可能会影响到 VS Code 的功能。但是,当我卸载了 Visual Studio 后,VSCode 就可以正常运行和调试代码了。 - Avi Kumar Singh

2

我的 c_cpp_properties.json 配置-

{
    "configurations": [
        {
            "name": "Win32",
            "compilerPath": "C:/MinGW/bin/g++.exe",
            "includePath": [
                "C:/MinGW/lib/gcc/mingw32/9.2.0/include/c++"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "cStandard": "c17",
            "cppStandard": "c++17",
            "intelliSenseMode": "windows-gcc-x64"
       }
    ],
    "version": 4
}

1
在设置中,进入c_cpp_properties.json更改以下设置:

enter image description here


为什么要发布一张文本的图片? - rioV8

1
我尝试了这个,现在可以正常工作。 c_cpp_properties.json 的配置
{
"configurations": [
    {
        "name": "Win32",
        "compilerPath": "C:/MinGW/bin/g++.exe",
        "includePath": [
            "C:/MinGW/lib/gcc/mingw32/9.2.0/include/c++"
        ],
        "defines": [
            "_DEBUG",
            "UNICODE",
            "_UNICODE"
        ],
        "cStandard": "c17",
        "cppStandard": "c++17",
        "intelliSenseMode": "windows-gcc-x64"
    }
],
"version": 4
  }

任务配置文件 task.json
{
"version": "2.0.0",
"tasks": [
    {
        "type": "cppbuild",
        "label": "C/C++: g++.exe build active file",
        "command": "C:\\MinGW\\bin\\g++.exe",
        "args": [
            "-g",
            "${file}",
            "-o",
            "${fileDirname}\\${fileBasenameNoExtension}.exe"
        ],
        "options": {
            "cwd": "C:\\MinGW\\bin"
        },
        "problemMatcher": [
            "$gcc"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "detail": "compiler: C:\\MinGW\\bin\\g++.exe"
    }
]}

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