生成compile_commands.json文件


文档摘要

生成 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 需要几个步骤:

  1. 首先,打开一个终端或命令提示符,并导航到你的项目根目录。

  2. 然后,运行带有 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON 选项的
    CMake,这会指示 CMake 创建一个 compile_commands.json
    文件。这个文件包含了你项目中所有源文件的编译命令。

  3. 在用 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。


发布者: 作者: 转发
评论区 (0)
U