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配置用于连接前后端。

参考资料:

  1. clangd download
  2. llvm-vs-code-extensions.vscode-clangd

vscode_plugin_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"
}

配置解释:

  1. --compile-commands-dir:用于指定compile_commands.json文件所在的目录,一般拷贝到.vscode目录防止误删
  2. -j:clangd索引时同时使用的最大线程数
  3. --query-driver:指定clang++位置
  4. clangd.path:配置clangd位置

最后需要重启vscode或者ctrl + shift + p输入clangd: Restart language server命令,触发vscode进行索引,索引使用的文件生成在.vscode/.cache目录。

这样c++代码跳转就配置好咯~