安装clangd协同vscode工作
安装Clangd
什么是Clangd?
clangd is a language server that can work with many editors via a plugin. Here’s Visual Studio Code with the clangd plugin, demonstrating code completion:
不多介绍,很牛逼就是了,对于我这种希望对代码做最精细检查的人来说非常好用
怎么安装Clangd?
对于 Debian Linux 或者 LinuxMint 用户(也包括对应的WSL用户,不再赘述)来说,输入
1 | sudo apt install clangd |
即可安装Clangd,其他发行版也可以在包管理器内找到对应的软件包,一般来说叫clangd
进行安装
安装名为“Clangd”的vscode插件
安装插件
点击vscode侧面的插件页面,搜索“Clangd”插件,作者为“LLVM”的那个就是
点击安装
对vscode的配置
基本不需要自己配置,
在安装了Clangd插件之后,它会自动提示“请禁用与Clangd冲突的插件”,点击允许的那个按钮就可以了
一般来说会禁用vscode自带的“IntelliSense”
如果不慎禁用了这个用于自动提示的对话框,可以在Clangd的插件设置里面找到关于这个对话框的设置clangd.detectExtensionConflicts
如何重新启用IntelliSense
假如出于各种原因,需要重新启用IntelliSense,怎么启用呢?
打开vscode对应阶段的settings.json
,一般来说,被clangd插件禁用的是用户层级的,那么
Linux在
1 | /home/user/.config/Code/User/settings.json |
Windows在
1 | %userprofile%/AppData\Roaming\Code\User\Settings.json |
中找到对应的配置文件
但是,最稳妥的办法是按下ctrl
+shift
+P
找到对应层级(用户级、工作区级、SSH连接级)的配置文件
查找这样一行
1 | "C_Cpp.intelliSenseEngine": "disabled", |
根据需要和提示修改为"disabled"
或者"default
",就可以控制IntelliSense的开关了
向clangd传递工程的情况
有时候自定义了一些头文件,放在了特殊的目录中,编译的时候也会使用gcc的-I
来控制头文件目录,但是对于语法检查程序来说并不知道编译参数是什么
这里参考llvm给出的文档
在工程目录下新建一个叫做.clangd
的文件,然后根据文章中的语法要求书写配置即可
例如我最关心的CFLAGS
(懒得翻译了)
CompileFlags
Affects how a source file is parsed.
CompileFlags: # Tweak the parse settings
Add: [-xc++, -Wall]
# treat all files as C++, enable more warningsRemove: -W*
# strip all other warning-related flagsCompiler: clang++
# Change argv[0] of compile flags toclang++
clangd emulates how clang would interpret a file. By default, it behaves roughly as clang $FILENAME, but real projects usually require setting the include path (with the-I
flag), defining preprocessor symbols, configuring warnings etc.Often, a compilation database specifies these compile commands. clangd searches for compile_commands.json in parents of the source file.
This section modifies how the compile command is constructed.
Add
List of flags to append to the compile command.
Remove
List of flags to remove from the compile command.
If the value is a recognized clang flag (like
-I
) then it will be removed along with any arguments. Synonyms like--include-directory=
will also be removed. Otherwise, if the value ends in*
(like-DFOO=*
) then any argument with the prefix will be removed. Otherwise any argument exactly matching the value is removed. In all cases, -Xclang is also removed where needed.Example:
Command:
clang++ --include-directory=/usr/include -DFOO=42 foo.cc
Configuration:Remove: [-I, -DFOO=*]
Result:clang++ foo.cc
Flags added by the same CompileFlags entry will not be removed.
比如我比较关心的-I
参数,那么就在文件里面写
1 | CompileFlags: |
重启vscode,发现语法检查已经跟上了,完事!
在交叉编译环境中的准备
在交叉编译环境中配置clangd
正常工作就必须用到vscode
的设置文件.vscode/settings.json
了
事实上我是很抗拒使用vscode
来进行配置的,因为vscode
在打开的工作区非单独工程目录时的表现过于蠢笨,它似乎没法理解这种情况
但对于交叉编译环境,使用settings.json
终归是最简单的办法
例如工程中实际使用的编译器是/opt/share/arm-blahblahcompany-linux-uclibcgnueabihf/bin/arm-blahblahcompany-linux-uclibcgnueabihf-gcc(g++)
那么就需要在工作区的顶层目录新建.vscode
文件夹,新增文件settings.json
(或向已经存在的文件增添以下内容)
1 | { |
这样的话,通过vscode
唤起的clangd
就会使用交叉编译器的环境进行配置
查找资料时发现的一点好玩的东西
据说某些版本的clangd
会因为gcc
输出了非英语英文的本地化字符而无法识别交叉编译环境,例如解决clangd设置query-driver后无法解析include路径
虽然我没有遇到,但如果发生这样的事情的话,可以考虑向这个方向怀疑
对此问题自行检查的办法是,运行 1
gcc -xc -v -E /dev/null
Knighthana
2023/11/16