1. c++代码跳转的前提
c++代码中,我们需要关注头文件搜索路径、编译时打开了哪些宏、这些宏在编译时的赋值,有这些输入才能准确地知道当前代码的编译环境,才能准确跳转到对应的头文件,才能正确显示这些宏开关。
c++中这类配置文件被称为编译数据库,即compile_commands.json
。该json中的每一项详细描述了一个源文件(.c或者.cpp)如何被编译,包括头文件的搜索路径、搜索顺序、宏是否打开。
普通工程如何生成compile_commands.json?
传统的c/c++工程使用的是Makefile编译,可以搭配Linux下的bear
命令,将make
作为输入,即可得到编译数据库。
2. vscode使用compile_commands.json进行索引
vscode使用的是LSP(language server protocol)架构,后端使用的是clangd server
,前端使用clangd
插件,另外还需要vscode配置用于连接前后端。
参考资料:
- clangd download
- llvm-vs-code-extensions.vscode-clangd
3. 举个例子
下面以ffmpeg-7.0编译,配置c/c++代码跳转环境举例:
下载ffmpeg-7.0源码:ffmpeg-7.0 download
解压:
$ tar -xvf ffmpeg-7.0.tar.xz
configure:
ffmpeg-7.0$ ./configure --prefix=/data/code/demo/ffmpeg/ffmpeg-7.0/install --disable-x86asm
编译安装:
ffmpeg-7.0$ sudo apt install bear
ffmpeg-7.0$ bear make -j$(nproc) && make install -j$(nproc)
这时在ffmpeg-7.0
目录下就得到了compile_commands.json
文件。
vscode配置
在ffmpeg-7.0
目录下新建.vscode
目录,在.vscode
目录下新建settings.json
文件,注意这个配置文件只对当前工程生效,settings.json
中输入以下内容:
{
"clangd.arguments": [
"--background-index",
"--compile-commands-dir=${workspaceFolder}/.vscode",
"-j=4",
"--query-driver=/usr/bin/clang++",
"--clang-tidy",
"--clang-tidy-checks=performance-*,bugprone-*",
"--all-scopes-completion",
"--completion-style=detailed",
"--header-insertion=iwyu",
"--pch-storage=disk",
],
"clangd.path": "/home/ubuntu/.local/clangd_17.0.3/bin/clangd"
}
配置解释:
- --compile-commands-dir:用于指定
compile_commands.json
文件所在的目录,一般拷贝到.vscode
目录防止误删 - -j:clangd索引时同时使用的最大线程数
- --query-driver:指定clang++位置
- clangd.path:配置clangd位置
最后需要重启vscode或者ctrl + shift + p
输入clangd: Restart language server
命令,触发vscode进行索引,索引使用的文件生成在.vscode/.cache
目录。
这样c++代码跳转就配置好咯~