Visual studio Code的clangd插件一篇通,上乘的C/C++开发环境配置
系列文章
苦于微软出品的 C/C++ 插件久矣,时不时就会出现代码提示失效,跳转失败的问题。现在火热的Jetbrains公司的Clion以及Vim上的Youcompleteme插件现在都在用clangd,相比于 C/C++扩展,clangd具有全项目索引、代码跳转、变量重命名、更快的代码补全、提示信息、格式化代码等功能,内存占用和资源占用上也更具优势。
好的工具安装也不是一蹴而就的,下面记录一下安装使用vscode-clangd的艰辛历程
本人系统环境 CentOS Linux release 7.9.2009 (Core)
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 build
compiledb 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-format
dump LLVM代码风格的配置文件,可以在此基础上根据需要进行调整,具体各配置项的代表意义可根据官方文档说明来理解。
将配置好的.clang-format
文件放在工程目录下即可,不要过多的纠结细节
clang-tidy配置
- 占个坑,待有空真实体验以后再补充
总结
至此,上乘的C/C++的VSCode开发环境需要的主要依赖的插件
- CMake
- CMake Tools
- clangd,其实涵盖了Clang Format以及Clang Tidy功能
- Doxygen Documentation Generator
技巧
Ctrl + Shift + P
显示所有命令,查找Preferences: OPen Default Settings (JSON)
,可以查看默认的配置文件,可以根据需要来定制进行环境的迁移
延伸
更多推荐
所有评论(0)