clangd中是否有“includePath”选项?

21
我曾使用VSCode C/C++扩展程序。在该扩展程序的一个json文件中,有一个名为"includePath"的功能,可以设置我的头文件路径,这样就可以在没有执行CMake或make的情况下,从头文件获得代码提示和代码完成。
现在我已经切换到neovim和clangd作为代码完成的语言服务器。我搜索了很多资料,但并没有找到与clangd选项相应的功能,除了这个链接
由于clangd是一个强大的语言服务器,我想知道它是否有这样的功能。如果有,我该如何使用呢?
注意:我使用一个名为"coc-clangd"的语言客户端。我不知道这是否重要。

3
您需要提供 compiler_commands.json 文件,请参考:https://clangd.llvm.org/installation.html。 - HolyBlackCat
我知道这一点。但是我使用catkin_make(ROS平台),它会自动生成CMake文件,然后我会根据它生成compile_commands.json。因此,如果我想要自动化这个过程,我不能使用这个文件来完成。 - AMIR REZA SADEQI
5个回答

13

Clangd使用compile_commands.json数据库文件,其中包含项目中每个文件的标志(例如包含目录)。但是此文件是自动生成的,因此所有对它的修改最终都将被覆盖。您可以使用-DCMAKE_CXX_FLAGS命令行参数要求CMake添加任何自定义编译标志。

系统头文件的示例(#include <file.h>):

cmake -DCMAKE_CXX_FLAGS="-isystem /path/to/includes" /path/to/source

对于项目头文件(#include "file.h"):

cmake -DCMAKE_CXX_FLAGS=-Ipath/to/includes /path/to/source

此外,你可以设置环境变量CXXFLAGS

export CXXFLAGS="-isystem /path/to/includes"
cmake path/to/sources

之后,您的compile_commands.json文件中应该出现新的标志。


2
如果你需要生成compile_commands.json,可以使用bear -- make来生成它。 - Alex
这对我很有用,我遇到了类似的问题,但是是针对诸如#include <iostream>之类的标准库,我一直在苦苦寻找哪些路径适用于系统头文件,我运行了这个命令以查看包含路径 gcc -H mySrcFile.cpp,现在我是这样运行CMake的 mkdir -pv $BUILD_DIR && cd $BUILD_DIR && cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_CXX_FLAGS="-isystem /usr/include/c++/11/ -isystem /usr/include/x86_64-linux-gnu/c++/11/" && make run - Simon Puente

12
也许这个链接很有用:https://clangd.llvm.org/config 在源代码目录的顶层创建一个名为'.clangd'的文件,添加这些内容。
CompileFlags: # Tweak the parse settings
  Add: 
    - "-I=[folder]"

但我认为这不是推荐的做法,所有包含目录应该添加到 CMakeLists.txt 文件中。


7
注意:如果您在 Visual Studio Code 中使用 clangd,则需要在 VS Code 设置中的“Clangd: Arguments”中添加--enable-config以使其使用.clangd文件source。并且我发现"-I=path/to/dir"无效,但是"--include-directory=path/to/dir"有效。 - Gabriel Devillers
@hideDragon 我认为你在 CMakeLists.txt 文件中添加的所有包含目录都应该在 compile_commands.json 中。但是!我认为你仍然应该创建 .clangd 文件!这是因为在这个配置文件中,你首先要使用命令 CompileFlags: 和它的成员 CompilationDatabase: ./build (如果你的 compile_commands.json 在项目的 build 子文件夹中) (链接) 将 clangd 指向 compile_commands.json,从那里开始它就可以自行运行了... - 71GA

10

您可以像下面这样将includePath添加到vscode的settings.json文件的clangd.fallbackFlags中:

"clangd.fallbackFlags": [
    "-I${workspaceFolder}/include",
    "-I/my/include"
]

7

要使用Clangd提供的代码完成功能,需让Clangd通过CMake使用的编译器调用从compiler_commands.json中检索包含路径。在CMakeLists.txt中设置CMAKE_EXPORT_COMPILE_COMMANDS选项,当运行CMake时,它将输出compiler_commands.json到构建目录中:

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

将生成的compiler_commands.json复制到项目源目录。Clangd现在将使用此文件。


那么,是不是必须先向 cmake 添加包含路径,然后 cmake 在自动生成 compiler_commands.json 时将这些包含路径包含在其中? - 71GA
compiler_commands.json复制到工作区目录并没有起到帮助的作用。我正在对oxen-io/oxen-core进行测试。 - Martin Braun

1
你可以使用 CPATH 环境变量。语法与 PATH 变量相同。
export CPATH="your/include:more/include:/usr/include"

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