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

22

声明:我对VS Code完全不熟悉,请大家温柔待我。:-)

我正在尝试为C++设置VS Code
然而,我明确想要设置它使用语言服务器协议与处理C++文件时通信的clangd

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

但是,我现在迷失了。
当我打开一个*.cpp*.hpp文件时,VS Code会向我推荐一些其他扩展(例如带有IntelliSense支持的官方Microsoft"C/C++"扩展),但我看不到clangd在哪里帮助我。

使用微软的“C/C++”扩展似乎可以直接使用,但我该如何使用clangd呢?

谢谢任何帮助。

2个回答

48

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

微软的“C/C++”扩展非常适合调试,我认为你应该安装它。

同时,Clangd在查找引用方面提供了更准确的结果。因此,我的建议是保留官方的“C/C++”扩展进行调试,但禁用其智能感知功能。将以下行添加到您的settings.json文件中:

    "C_Cpp.intelliSenseEngine": "Disabled",
        
    "clangd.path": "/path/to/your/clangd",
    "clangd.arguments": ["-log=verbose", 
                         "-pretty", 
                         "--background-index", 
                         //"--query-driver=/bin/arm-buildroot-linux-gnueabihf-g++", //for cross compile usage
                         "--compile-commands-dir=/path/to/your/compile_commands_dir/"]

注意: 目录/path/to/your/compile_commands_dir/应该有一个compile_commands.json文件。

始终参考官方网站,还有更多的设置,比如过滤编译参数等。 配置正确后,您将在“问题”和“终端”旁边的“输出”窗口中看到clangd的输出。

enter image description here


我已经配置了“clangd.arguments”,但是在settings.json中它被模糊化了,这是什么意思? - frogEye
@frogEye 这通常意味着该功能已过时或不存在,但我不确定为什么会出现这种情况,因为这个功能肯定存在且不过时。您可以尝试添加另一行配置 "clangd.checkUpdates": true 然后看看效果如何? - George Zheng
@GauravAggarwal 正如它的名字所示,它是一个json文件数据库,用于告知clangd如何处理它。如果您使用的是cmake,则可以通过 set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 来启用它。如果不是,则可以尝试使用此项目Bear - George Zheng
如果 "C_Cpp.intelliSenseEngine": "Disabled",那么 "C_Cpp.autocomplete""C_Cpp.errorSquiggles" 设置将不需要,因为它们将被忽略。参考链接:https://github.com/microsoft/vscode-cpptools/issues/4979#issuecomment-723224009。 - Mark G
1
@roulette01没错。我的快照已经过期了。 - George Zheng
显示剩余4条评论

6
它应该能够在没有任何配置的情况下工作。我已经在Windows上测试过了,它运行得非常好——我在Visual Studio Code中没有安装C/C++扩展,只有vscode-clangd,它报告错误、提供代码完成等等功能。这意味着扩展程序可以正常工作,因为“核心”Visual Studio Code中没有这些功能。Visual Studio Code仍然建议使用流行的C/C++扩展,但您可以忽略它,这并不意味着vscode-clangd不能工作。
请注意,您正在编辑的文件必须具有标准扩展名,例如.cpp.c,才能被vscode-clangd识别和处理。请参阅扩展源代码以获取所有支持的扩展列表。
对于简单项目,没有配置可能就足够了,但对于更复杂的项目,您当然需要让Clang知道包含目录、编译标志等信息。这可以通过创建compile_flags.txt文件来完成,在其中每行输入Clang的参数。您可以将此文件放在与源文件相同的文件夹中或树的任何位置。编辑此文件后,您必须重新启动Visual Studio Code,以使更改生效。
或者,您可以创建(或让CMake生成)一个compile_commands.json文件。它具有以下语法:
[
  { "directory": "/home/user/llvm/build",
    "command": "/usr/bin/clang++ -Irelative -DSOMEDEF=\"With spaces, quotes and \\-es.\" -c -o file.o file.cc",
    "file": "file.cc" },
  ...
]

请参见Clang文档获取更多详细信息。

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