用 Bear 生成 compile_commands.json 是为 Clangd 提供编译信息最直接的方式之一,尤其适合基于 make、cmake(非 Ninja)或自定义构建脚本的项目;需单独安装 Bear,用 bear -- 前缀包裹构建命令以拦截编译调用并生成标准 JSON 数据库。
用 Bear 生成 compile_commands.json 是为 Clangd 提供编译信息最直接的方式之一,尤其适合基于 make、cmake(非 Ninja)或自定义构建脚本的项目。关键在于让 Bear 拦截实际调用的编译命令,并汇总成标准 JSON 编译数据库。
Bear 是一个独立的工具,不是 Clang 或 CMake 自带组件。需单独安装:
brew install bear
sudo apt install bear
sudo pacman -S bear
安装后运行 bear --version 验证是否就绪。
Bear 本身不解析 CMakeLists.txt 或 Makefile,而是通过 LD_PRELOAD 拦截子进程中的 gcc、g++、clang、clang++ 调用。因此必须用 bear -- 前缀启动你的构建流程:
bear -- make clean && bear -- make -j(注意:两次都要加 bear --,clean 不产生编译命令,但后续 build 必须被拦截)mkdir build && cd build && bear -- cmake .. && bear -- make -j
-G "Unix Makefiles" 再构建成功执行后,当前目录(或指定输出路径)会生成 compile,内容为每个源文件对应的完整编译命令数组。
_commands.json
Clangd 默认会在项目根目录查找 compile_commands.json。确认以下几点:
clangd.fallbackFlags 手动指定包含路径Clangd: Restart language server,观察输出通道是否提示 “Loaded compilation database”.cpp 文件,悬停函数或按 Ctrl+Click 应能跳转到定义,且无“no definition found”提示如果 Bear 未生成文件或 Clangd 读取失败,可排查:
make 返回 “nothing to be done”,Bear 就不会记录任何命令。先 make clean 再 bear -- make
arm-linux-gnueabihf-g++ 等交叉编译器,需用 --append 或改用 intercept-build(Bear 3.0+ 新命令)并配合 --override-compiler
cmake -G "Unix Makefiles";或直接用 CMake 3.19+ 内置导出:cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..,无需 Bear不复杂但容易忽略:Bear 只捕获它看到的那一次构建过程,务必保证构建命令中确实调用了 C++ 编译器,且没有被缓存跳过。