如何使用 clangd 支持为 C++ 设置 VS Code?

Den*_*dir 4 c++ clang visual-studio-code language-server-protocol

免责声明:我完全了解 VS Code,所以,请对我温柔一点。:-)

我正在尝试为C++设置VS Code。 但是,我明确希望对其进行设置,以便在处理 C++ 文件时使用语言服务器协议进行通信。
clangd

我已经clangd在我的 (Ubuntu Linux) 系统上安装了 VS Code 市场的官方 “vscode-clangd”扩展,我还调整了它的设置,以便它clangd可以找到它。

然而,现在我迷路了。
当我打开一个*.cpp*.hpp文件时,VS Code 向我推荐了一些其他扩展(例如支持 IntelliSense的官方 Microsoft “C/C++”扩展),但我根本看不到在哪里以及如何clangd帮助我。

使用 Microsoft 的“C/C++”扩展似乎开箱即用,但我该如何使用clangd

谢谢你的帮助。

小智 11

我可以分享我的一些配置。

Microsoft“C/C++”扩展非常适合调试,我认为您应该安装它。

同时,Clangd 在查找引用时提供了更准确的结果。所以,我的建议是保留官方的 C/C++ 调试扩展,但禁用它的智能感知。把下面几行放到你的 settings.json 中

    "C_Cpp.intelliSenseEngine": "Disabled",
    "C_Cpp.autocomplete": "Disabled",  // So you don't get autocomplete from both extensions.
    "C_Cpp.errorSquiggles": "Disabled", // So you don't get error squiggles from both extensions (clangd's seem to be more reliable anyway).
    
    "clangd.path": "/path/to/your/clangd",
    "clangd.arguments": ["-log=verbose", "-pretty", "--background-index", "--compile-commands-dir=/path/to/your/compile_commands_dir/"]
Run Code Online (Sandbox Code Playgroud)

正确配置后,您将在问题和终端旁边的 OUTPUT 窗口中看到 clangd 的输出。

在此处输入图片说明


Jan*_*neš 7

它应该无需任何配置即可工作。\n我已经在 Windows 上进行了测试,它工作得很好\xe2\x80\x94我没有在 Visual Studio Code 中安装 C/C++ 扩展,只是vscode-clangd报告错误、提供代码完成等。\这意味着该扩展可以工作,因为“核心”Visual Studio Code 中没有此类功能。\nVisual Studio Code 仍然建议流行的 C/C++ 扩展,但您可以忽略它,这并不意味着不是这样的vscode-clangd。工作。

\n\n

请注意,您正在编辑的文件必须具有标准扩展名,例如.cpp.c才能被 识别并执行操作vscode-clangd。\n请参阅扩展名的源代码以获取所有支持的扩展名的列表。

\n\n

对于简单的项目,没有配置可能就足够了,但对于更复杂的项目,您当然需要让 Clang 知道诸如包含目录、编译标志等的信息。\n这可以通过创建一个文件来完成,您可以在其中compile_flags.txt键入参数Clang,每行一个。\n您可以将此文件放入与源文件相同的文件夹中或树上的任何位置。\n编辑此文件后,您必须重新启动 Visual Studio Code,以使更改生效。

\n\n

或者,您可以创建(或让 CMake 生成)一个compile_commands.json文件。\n它具有以下语法:

\n\n
[\n  { "directory": "/home/user/llvm/build",\n    "command": "/usr/bin/clang++ -Irelative -DSOMEDEF=\\"With spaces, quotes and \\\\-es.\\" -c -o file.o file.cc",\n    "file": "file.cc" },\n  ...\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关更多详细信息,请参阅Clang 文档。

\n


sta*_*all 6

请参阅VS Code Clangd 扩展的项目设置文档,其中指出:

\n
\n

你必须告诉 clangd 你的项目是如何构建的(编译标志)。compile_commands.json 文件通常可以由您的构建系统生成(例如使用 CMake,通过设置-DCMAKE_EXPORT_COMPILE_COMMANDS=1)。

\n

有关详细信息和替代方案,请参阅clangd 文档中的项目设置。

\n
\n

在链接的 clangd 文档中,您将看到:

\n
\n

compile_commands.json
\n此文件为项目中的每个源文件提供编译命令。它通常是由工具生成的。

\n

clangd 将在您编辑的文件的父目录中查找,也会在名为 的子目录中查找build/。例如,如果编辑,我们在, , , , \xe2\x80\xa6$SRC/gui/window.cpp中搜索$SRC/gui/$SRC/gui/build/$SRC/$SRC/build/

\n
\n

使用 CMake 生成compile_commands.json 的人员的信息

\n

由于 CMake 在构建树的根目录中生成编译命令数据库,除非您正在进行源内构建,否则您可能需要

\n\n

另请参阅文档CMAKE_EXPORT_COMPILE_COMMANDS(请注意,仅当您使用 Ninja 或 Makefile 生成器时,在撰写本文时才支持)。您可能需要将该副本的路径添加到您的 .gitignore。

\n

如果您正在使用 CMake 工具扩展:文档说要使用-D...,如果您自己通过命令行调用配置命令,则可以这样做。如果您通过 VS Code CMake 工具扩展执行此操作,则可以使用cmake.configureSettings它提供的设置,或者编写CMake 配置预设并使用该cacheVariables属性(因为 CMake 工具支持 CMake 预设)。

\n