clangd 中有“includePath”选项吗?

问题描述 投票:0回答:5

我曾经使用 VSCode C/C++ 扩展。这个扩展中有一个功能(在 json 文件中),称为“includePath”,我可以设置标头的路径,因此无需执行 CMake 或 make,我就会从这些中获得标头和代码完成的建议.

现在我已经切换到 neovim 和 clangd 作为代码补全的语言服务器。我搜索了很多以在 clangd options 中找到相应的功能,但除了这个链接之外我找不到任何东西。

既然clangd是一个强大的语言服务器,我想知道它是否没有这样的功能。所以我想知道clangd中是否真的有这样的功能?如果是的话我该如何使用它?

注意:我使用一个语言客户端,名为 “coc-clangd”。我不知道这是否重要。

c++ c neovim clangd
5个回答
15
投票

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
文件中。


14
投票

也许这很有用: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
文件中。


11
投票

您可以将

includePath
添加到
clangd.fallbackFlags
到 vscode 的
settings.json
中,如下所示:

"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 现在将获取该文件。


2
投票

您可以使用

CPATH
环境变量。语法与
PATH
变量相同。

export CPATH="your/include:more/include:/usr/include"
© www.soinside.com 2019 - 2024. All rights reserved.