生成 compilecommands.json 文件有多种方式,构建系统 CMake 内置了对生成编译数据库的支持。一些工具还可以从 Makefile 或其他构建系统中生成这个文件。甚至还有像 Bear 和 intercept-build 这样的工具,可以通过截取实际运行的编译命令来生成 CDB。 尽管这个术语通常与 Clang 和基于 LLVM 的工具相关联,但这个概念本身更为通用,理论上可以理解成一组源文件编译设置的工具使用。我们将从使用 CMake ,来生成 CDB。 使用 CMake 生成 CDB 需要几个步骤: 首先,打开一个终端或命令提示符,并导航到你的项目根目录。
生成 compile_commands.json 文件有多种方式,构建系统 CMake
内置了对生成编译数据库的支持。一些工具还可以从 Makefile
或其他构建系统中生成这个文件。甚至还有像 Bear 和 intercept-build
这样的工具,可以通过截取实际运行的编译命令来生成 CDB。
尽管这个术语通常与 Clang 和基于 LLVM
的工具相关联,但这个概念本身更为通用,理论上可以理解成一组源文件编译设置的工具使用。我们将从使用
CMake ,来生成 CDB。
使用 CMake 生成 CDB 需要几个步骤:
首先,打开一个终端或命令提示符,并导航到你的项目根目录。
然后,运行带有 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON 选项的
CMake,这会指示 CMake 创建一个 compile_commands.json
文件。这个文件包含了你项目中所有源文件的编译命令。
在用 CMake 配置项目之后,你可以在运行配置命令的同一目录中找到
compile_commands.json 文件。
正如我们之前注意到的,LLVM 默认创建了 CDB。这是可行的,因为
llvm/CMakeLists.txt 包含以下设置:
# Generate a CompilationDatabase (compile_commands.json file) for our
build, # for use by clang_complete, YouCompleteMe, etc.
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
图 9.3:来自 llvm/CMakeLists.txt 的 LLVM-18.x CMake 配置
即,它默认设置了 CDB 生成。
Ninja 也可以用来生成 CDB。我们可以使用 Ninja 的一个子工具 "compdb" 将
CDB 输出到标准输出。要运行这个子工具,我们在 Ninja 中使用 -t <subtool>
命令行选项,使用以下命令通过 Ninja 生成 CDB:
图 9.4:使用 Ninja 创建 CDB
这个命令指示 Ninja 生成 CDB 信息,并将其保存在 compile_commands.json
文件中。
生成的编译数据库可以与我们在本书中描述的不同 Clang
工具一起使用。来看看两个最有价值的示例,包括 Clang-Tidy 和 Clangd。