VSCode使用Clangd
clangd基于Clang C++ 编译器,是LLVM项目中的一部分。clangd是一个语言服务器,可以通过插件与VSCode一起工作,协助进行代码补全等。
clangd的使用依赖于compile_commands.json编译数据库,该文件是一个包含项目中每个编译单元结构化数据的json格式文件。
当前Linux工程中CMAKE、Makefile等可以生成compile_commands.json:
-
其中CMAKE直接添加
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
或命令行使用-DCMAKE_EXPORT_COMPILE_COMMANDS=on
即可生成 -
Makefile工程要生成该文件略复杂,可以通过bear或compiledb完成
-
通过bear生成compile_commands.json
- 使用方法:直接在执行脚本或Makefile文件前加bear:
bear sh -x build_vodlayer.sh
或bear make
- 优缺点:优点是支持执行脚本、可以使用更复杂的编译指令;缺点是必须要实际执行,在处理大型项目时,整体耗时较长;
- 使用方法:直接在执行脚本或Makefile文件前加bear:
-
通过compiledb生成compile_commands.json
-
使用方法
-
compiledb -nv make
-
compiledb -nv -d ./src/vod/ make
其中-n表示不实际执行make,-v表示输出详细信息,-d指定Makefile路径,实测Makefile在当前路径下,直接使用命令1,Makefile在子路径下,使用-d指定Makefile路径,即命令2(注:支持Makefile嵌套执行)
-
-
优缺点:优点是直接扫描Makefile文件,速度快;缺点是不支持执行脚本、不支持复杂的编译指令;
-
-
在生成compile_commands.json文件之后,直接点击源代码文件中任一变量或函数等,均可加载索引,加载时间与clangd配置、内存性能和源文件链接数量等相关。
实测clangd在centos7编译机中,加载索引速度为:
索引文件数量 | 程序 | 加载时间 |
---|---|---|
217 | xxxx | <5分钟 |
73 | xxxx | 10~15秒 |
VSCode中clangd部分配置说明:
"C_Cpp.intelliSenseEngine": "disabled", //关闭C/C++的智能感知
"clangd.onConfigChanged": "restart", //配置改变时重启
"clangd.arguments": [
// compile_commands.json
"--compile-commands-dir=${workspaceFolder}/build", //指定输出json文件的路径
"--all-scopes-completion", //所有作用域补全
"--background-index", //后台索引,并持久化到磁盘中
"--completion-style=bundled", //补全/建议风格:打包,可选detailed
"--enable-config", //支持从yaml文件中读取配置
"--function-arg-placeholders=true", //自动补全函数参数占位符
"--header-insertion=never", //不自动插入头文件
"--log=verbose", //日志类型
"--pch-storage=memory", //pch优化的位置,支持memory和disk
"--pretty", //对输出的json文件格式化
"--ranking-model=decision_forest", //排序模型
"-j=16", //clangd任务执行的线程数
"--clang-tidy", //代码静态检查
"--background-index-priority=normal", //后台索引优先级
"--parse-forwarding-functions"
],
"clangd.checkUpdates": true, //clangd自动更新
由于上述过程会产生compile_commands.json和大量的clangd索引文件,建议在svn或git中配置忽略项:compile_commands.json
和.cache
- 更新一下:在centos7上安装compiledb有些费力,推荐一个开源的compiledb-go,作者使用go语言重写了,方便部署。compiledb-go