我曾经使用 VSCode C/C++ 扩展。这个扩展中有一个功能(在 json 文件中),称为“includePath”,我可以设置标头的路径,因此无需执行 CMake 或 make,我就会从这些中获得标头和代码完成的建议.
现在我已经切换到 neovim 和 clangd 作为代码补全的语言服务器。我搜索了很多以在 clangd options 中找到相应的功能,但除了这个链接之外我找不到任何东西。
既然clangd是一个强大的语言服务器,我想知道它是否没有这样的功能。所以我想知道clangd中是否真的有这样的功能?如果是的话我该如何使用它?
注意:我使用一个语言客户端,名为 “coc-clangd”。我不知道这是否重要。
Clangd 使用
compile_commands.json
数据库文件,其中包含项目中每个文件的标志(例如包含目录)。但该文件是自动生成的,因此对其进行的所有修改最终都会被覆盖。您可以要求 CMake 使用 -DCMAKE_CXX_FLAGS
命令行参数添加任何自定义编译标志。
系统标题示例 (
#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
文件中。
也许这很有用:https://clangd.llvm.org/config
在源目录的顶层创建一个名为“.clangd”的文件。 添加这些内容。
CompileFlags: # Tweak the parse settings, example directory given to show format
Add:
# - "-I=[folder]" # old answer
- "-I[folder]" # e.g `-I/usr/include/SDL2` suggested from @Palmkeep
但我认为不建议这样做,所有包含目录都应该添加到
CMakeLists.txt
文件中。
您可以将
includePath
添加到 clangd.fallbackFlags
到 vscode 的 settings.json
中,如下所示:
"clangd.fallbackFlags": [
"-I${workspaceFolder}/include",
"-I/my/include"
]
要使用 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 现在将获取该文件。
您可以使用
CPATH
环境变量。语法与 PATH
变量相同。
export CPATH="your/include:more/include:/usr/include"