如何在VS Code中为CMake项目设置C/C++ IntelliSense?

11
我正在尝试使用libTooling编写工具。我已经按照LLVM文档中的示例进行设置,以使其能够编译。然而,C/C++ Intellisense似乎不能与CMake项目一起使用。
我的工具位于: /clang-tools-extra/mytool
现在,C/C++扩展程序尝试读取compile_config.json并告诉我无法找到/build/compile_config.json,因此改用c_cpp_properties.json中的includePath。
我尝试手动添加包含路径到我的工作区设置中:
{
    "C_Cpp.default.includePath": [
        "../../",
        "../../clang/Frontend/",
        "../../clang/Tooling/",
        "../../llvm/Support/"
    ],
    "C_Cpp.default.browse.path": [
        "../.."
    ]
}

或者在一个名为 c_cpp_properties.json 的文件中。但它仍然在错误的位置搜索包含文件。例如,包含文件:
#include "llvm/Support/CommandLine.h"

它试图在<project>/llvm/include/llvm/Support/CommandLine.h中寻找。所以显然它从command_config.json读取了一些东西,即使它说找不到(尽管它在那里),但是是错误的东西。它根本不应该添加llvm/include
6个回答

16

针对VSCode 1.63+ (2022年或之后版本):

1. 安装CMake工具扩展 (ms-vscode.cmake-tools)。

2. 将以下代码添加到 .vscode/c_cpp_properties.json 文件中:

{
    "configurations": [
        {
            "name": "CMake",
            "compileCommands": "${config:cmake.buildDirectory}/compile_commands.json",
            "configurationProvider": "ms-vscode.cmake-tools"
        }
    ],
    "version": 4
}

5

您需要安装cmake-tool扩展 (ms-vscode.cmake-tools) 并将以下配置添加到您的 c_cpp_properties.json 文件中:

{
    "configurations": [
        {
            "compileCommands": "${workspaceFolder}/_build/compile_commands.json",
            "configurationProvider": "ms-vscode.cmake-tools"
        }
    ],
    "version": 4
}

对我来说它就有效


5

1) 将'"compileCommands"'指向'compile_commands.json'
2) 你可能想要添加 **,例如:../../** 双星号使其递归
3) 你可以使用一些变量,如${workspaceRoot},而不是在包含路径中使用相对路径。


嗨,pooya13,感谢您提供的那些技巧。我认为它们改善了配置。与此同时,我已经解决了问题(是MSVC出了问题,使用clang就可以了)。无论如何,我仍然接受了这个答案,因为它提供了额外的帮助。 - CodeMonkey

0
如果您正在使用CMake Tools扩展,
您需要配置Cpptools扩展以使用CMake工具扩展作为配置提供程序。
如果您不需要定义多个C/C++配置,我建议您将以下内容放入您的工作区的.vscode/settings.json文件中。
"C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",

否则,您可以在您的.vscode/c_cpp_configurations.json中创建一个c_cpp配置,并在其中设置configurationProvider。例如(将其放在configurations数组属性中)。
{
    "name": "CMake Tools",
    "configurationProvider": "ms-vscode.cmake-tools"
}

你可能需要运行配置和构建,以便 IntelliSense 能够跟上你的更改。关于实现细节或历史细微差别,我并不确定。根据我的观察,问题检测是基于构建诊断的,因此你需要重新构建以“刷新”编辑器中的错误标记等问题检测。
就是这样。如果你是那种喜欢阅读文档的人(疯了吧,有人喜欢这样的存在吗?)...
CMake Tools 的设置 IntelliSense 的文档可以在这里找到here。引用其中的内容:

CMake Tools 目前支持微软的 ms-vscode.cpptools 扩展。如果已安装并启用了 ms-vscode.cpptools 扩展,那么配置项目将自动提供此集成。

ms-vscode.cpptools 将显示一个提示,确认您希望使用 CMake Tools 提供项目的配置信息。接受此提示以激活集成。随后,CMake Tools 将为项目中的每个源文件提供并自动更新 cpptools 的配置信息。

在Cpptools的常见问题解答中,关于设置IntelliSense的条目可以在这里找到here。引用其中的内容:

或者,如果您安装了与我们的扩展接口相连的构建系统扩展,您可以允许该扩展为您提供配置。例如,CMake Tools扩展可以配置使用CMake构建系统的项目。使用C/C++: Change Configuration Provider...命令来启用任何此类扩展为IntelliSense提供配置。

关于configurationProvider设置的Cpptools文档可以在这里找到here。引用其中的内容:

configurationProvider: 一个能够为源文件提供智能感知配置信息的VS Code扩展的ID。例如,使用VS Code扩展ID ms-vscode.cmake-tools 来提供来自CMake Tools扩展的配置信息。如果您指定了一个configurationProvider,它提供的配置将优先于中的其他设置。

这里写的其他几个答案还建议您设置配置的compileCommands属性。根据我的经验,我发现这并不是必需的。如果我理解正确,这只是使用Cpptools扩展获得智能感知的另一种独立方式。再次引用 Cpptools FAQ中关于设置智能感知的条目

对于不支持构建系统扩展的项目,第三个选择是使用compile_commands.json文件,如果您的构建系统支持生成此文件。在配置界面的“高级”部分,您可以提供compile_commands.json的路径,扩展将使用该文件中列出的编译信息来配置智能感知。
强调“第三个选项”。此外,CMake目前不支持为其支持的所有生成器创建编译命令数据库文件。请参阅CMAKE_EXPORT_COMPILE_COMMANDS的文档,其中指出:
注意:此选项仅由Makefile生成器Ninja生成器实现。在其他生成器上将被忽略。
所以使用它并不是最具可移植性的方法。
如果您正在使用Clangd扩展
我已经在其他地方写过这个问题:如何使VS Code的clangd扩展意识到我在CMake配置中定义的包含路径?。简而言之,如果您不是在源代码构建中,您需要告诉clangd您的compile_commands.json文件在哪里。

0
如果有其他人遇到了这个问题,我可以通过从MSVC完成切换到clang来解决它。
使用clang,它实际上给了我工具提示,显示路径是错误的。
在此处查看如何将智能感知模式和位置设置为clang: https://code.visualstudio.com/docs/languages/cpp

0
也许您只需要启用扩展cmake-tools,正确配置CMakeLists.txt,然后运行cmake即可。
通常情况下,只要cmake没有错误,智能感知就应该正常工作。

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