Visual Studio Code的clangd插件一篇通
一月 03, 2024 [C/C++] #Linux #Shell 与命令行 #obsidian #编译链接Visual Studio Code的clangd插件一篇通
苦于微软出品的 C/C++ 插件久矣,时不时就会出现代码提示失效,跳转失败的问题。现在火热的Jetbrains公司的Clion以及Vim上的Youcompleteme插件现在都在用clangd,相比于 C/C++扩展,clangd具有全项目索引、代码跳转、变量重命名、更快的代码补全、提示信息、格式化代码等功能,内存占用和资源占用上也更具优势。
clangd插件安装
- clangd插件与微软的C/C++相关插件冲突,那么安装之前关闭
Ctrl + Shift + X在扩展商店中搜C/C++禁用已安装的C/C++插件,如C/C++、C/C++ Themes等 - 安装clangd插件
Ctrl + Shift + X在扩展商店中搜clangd安装即可 - 安装clangd应用,
clangd插件是基于clangd命令实现的Ctrl + Shift +P在命令窗口中搜clangd: Download language server,vscode自动从https://github.com/clangd/clangd/releases下载最新的clangd包,剩下就是焦灼的等待。
第三步也可以手动下载对应的离线包,如clangd-linux-16.0.2.zip,然后解压后将其bin路径配置到PATH环境变量中,重启vscode即可。
不幸的是一遍遍的安装一遍遍的提示找不到不clangd需要下载安装,手动执行clangd --version出现bin/clangd: /lib64/libc.so.6: version GLIBC_2.18’ not found (required by bin/clangd)`错误提示。
rpm -qf /lib64/libc.so.6查看这个动态库属于glibc-2.17-325.el7_9.x86_64,通过命令strings /lib64/libc.so.6 | egrep ^GLIBC_2查看其兼容的版本号。
CentOS上各种库与工具相对来说版本都很低。那么接下来更新一些工具库来源码编译clangd
源码编译clangd
clangd understands your C++ code and adds smart features to your editor: code completion, compile errors, go-to-definition and more.
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 is based on the Clang C++ compiler, and is part of the LLVM project.
升级cmake版本
根据llvm源码告警,cmake版本不低于3.20.0
- 下载Binary distributions
wget https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4-linux-x86_64.tar.gz - 解压
tar -xvf cmake-3.27.4-linux-x86_64.tar.gz - 将cmake的bin目录添加到PATH路径里,如
export PATH=/usr/local/cmake-3.27.4-linux-x86_64/bin:$PATH
升级gcc版本
根据cmake告警提示Host GCC version must be at least 7.1, your version is 4.8.5.,gcc版本不低于7.1,这里直接安装使用scl的devtoolset-8工具链
yum install -y centos-release-scl
yum install -y scl-utils-build
yum install -y devtoolset-8-toolchain
scl -l
scl enable devtoolset-8 bash
编译clangd
-
参考官方资料 https://clangd.llvm.org/ faq
-
下载llvm-project源码包
wget https://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.6/llvm-project-16.0.6.src.tar.xz -
编译参数
tar -xvf llvm-project-16.0.6.src.tar.xz mkdir llvm-project-16.0.6.src/build cd llvm-project-16.0.6.src/build cmake3 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/llvm-16.0.6 -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" ../llvm make install -j $(nproc) -
编译完成后将
/usr/local/llvm-16.0.6/bin添加到PATH环境变量中
配置
配置相对来说比较复杂,包括插件配置,工程配置,格式化风格配置等
插件配置
Ctrl + ,切换出配置页面,【工作区】【扩展】【clangd】,也可以在settings.json直接配置,其中clangd.arguments的配置clangd --help即可
// 是否检查插件冲突
"clangd.detectExtensionConflicts": true,
"clangd.path": "clangd",
// 查找的头文件路径,每一项前缀 -I
"clangd.fallbackFlags": [],
"clangd.arguments": [
// 在后台自动分析文件(基于complie_commands)
"--background-index",
// 标记compelie_commands.json文件的目录位置
// "--compile-commands-dir=build",
// 同时开启的任务数量
"-j=12",
// 全局补全(会自动补充头文件)
"--all-scopes-completion",
// 更详细的补全内容
"--completion-style=detailed",
// Include what you use
"--header-insertion=iwyu",
// pch优化的位置 disk memory
"--pch-storage=memory",
"--cross-file-rename",
"--enable-config",
// clang-format style to apply by default when no .clang-format file is found
"--fallback-style=WebKit",
"--pretty",
"--clang-tidy",
"--query-driver=clang++",
]
Project setup
clangd is based on the clang C++ compiler, and understands even complex C++ code. However, you must tell clangd how your project is built (compile flags). A compile_commands.json file can usually be generated by your build system
参考 Project setup官方文档,总结三种生成 compile_commands.json 文件的方法
-
如果通过cmake 方式编译项目,3.5+版本中,在
CMakeLists.txt工程文件中添加**set(CMAKE_EXPORT_COMPILE_COMMANDS ON)** ,或者cmake添加-DCMAKE_EXPORT_COMPILE_COMMANDS=ON参数,make后可以在 build 目录下生成compile_commands.json文件 -
如果是基于
make方式来编译,那么可以先安装pip install compiledb,之后在当前目录下运行compiledb -n make -C buildcompiledb make -C build
这两个命令中的其中一个来生成 compile_commands.json 文件,其中前者不会执行真正的 make 编译命令。
-
如果是基于其他方式,可以使用 https://github.com/rizsotto/Bear 项目中的方式来生成对应的 compile_commands.json 文件
格式化配置文件
配置默认的格式插件
- 选择需要设置格式化插件的文件
- 鼠标右键进行点击
- 选择 【使用…格式化文档】
- 选择 【配置默认格式化程序】
- 选择你需要的格式化插件即可,如
clangd
也可以参考下列配置
"[cpp]": {
// 在cpp文件中,编辑器在保存的时候进行格式化
"editor.formatOnSave": true,
"editor.formatOnSaveMode": "file"
// 在cpp文件中,编辑器在打字的时候进行格式化
"editor.formatOnType": true,
// 在cpp文件中,编辑器在粘贴的时候进行格式化
"editor.formatOnPaste": true,
"editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd"
}
clangd根据.clang-format配置文件进行格式化代码,若改配置文件未找到,则使用fallback-style参数指定的风格进行格式化代码。
clang-format工具提供格式化功能,默认提供几个比较流行的代码风格。可以根据官方文档给出主流的代码风格连接进行查看,也可以使用工具进行格式处理查看效果
clang-format --style=LLVM -i main.cpp对main.cpp源文件进行格式化处理,并改写原文件。clang-format --style=LLVM --dump-config > .clang-formatdump LLVM代码风格的配置文件,可以在此基础上根据需要进行调整,具体各配置项的代表意义可根据官方文档说明来理解。
将配置好的.clang-format文件放在工程目录下即可,不要过多的纠结细节
总结
至此,上乘的C/C++的VSCode开发环境需要的主要依赖的插件
- CMake
- CMake Tools
- clangd,其实涵盖了Clang Format以及Clang Tidy功能
- Doxygen Documentation Generator
技巧
Ctrl + Shift + P显示所有命令,查找Preferences: Open Default Settings (JSON),可以查看默认的配置文件,可以根据需要来定制进行环境的迁移