编译数据库:Compilation Database
【摘要】 编译数据库是一个JSON格式的文件,它包含项目中每个编译单元的结构化数据。
编译数据库:Compilation Database
定义
编译数据库是一个JSON格式的文件,它包含项目中每个编译单元的结构化数据。
编译数据库文件
生成compile_commands.json文件,用于放在构建目录的顶部,以检测文件并使用编译数据库解析源代码树中的c++代码。
编译数据库的格式
即:JSON编译数据库格式规范
[
{ "directory": "/home/user/llvm/build",
"arguments": ["/usr/bin/clang++", "-Irelative", "-DSOMEDEF=With spaces, quotes and \\-es.", "-c", "-o", "file.o", "file.cc"],
"file": "file.cc" },
{ "directory": "/home/user/llvm/build",
"command": "/usr/bin/clang++ -Irelative -DSOMEDEF=\"With spaces, quotes and \\-es.\" -c -o file.o file.cc",
"file": "file2.cc" },
...
]
- directory: 编译的工作目录。命令或文件字段中指定的所有路径必须是该目录的绝对路径或相对路径。
- file:此编译步骤处理的主要编译单元源代码。同一个文件可以有多个命令对象,例如,如果用不同的配置编译同一个源文件。
- arguments: 编译命令argv为字符串列表。用于编译,参数[0]应该是可执行文件名,比如clang++。参数不应该被转义,而应该准备好传递给execvp()。
- command: 编译命令作为单个shell转义字符串。根据平台约定,参数可以被shell引用并转义,’ " ‘和’ \ '是唯一的特殊字符,不支持扩展Shell。
- output: 此编译步骤创建的输出名称。可以用来区分同一输入文件的不同处理方式。
编译数据库支持的系统
- CMake:CMAKE_EXPORT_COMPILE_COMMANDS参数生成编译数据库
# Unix Makefiles (since 2.8.5)
# Ninja (since 2.8.9
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=On …
- Clang:-MJ参数生成编译数据库
clang -MJ a.out.json …
拦截编译器调用
- Bear:通过Bear工具生成编译数据库
# https://github.com/rizsotto/Bear bear build.sh
- scan-build:intercept-build
# https://github.com/rizsotto/scan-build scan-build build.sh
Bazel:能够导出编译数据库
https://github.com/grailbio/bazel-compilation-databaseNinja:-t compdb参数生成编译数据库
ninja -t compdb > compile_commands.json
- Visual Studio:SourceTail扩展插件生成编译数据库
#https://github.com/CoatiSoftware/vs-sourcetrail
Visual Studio solution => JSON compilation database
- 解析构建日志
# https://github.com/nickdiego/compiledb
compiledb --parse build-log.txt
编译捕获的核心原理
LD_PRELOAD是Linux/Unix系统的一个环境变量,它可以影响程序的运行时的链接,它允许在程序运行前定义优先加载的动态链接库。通过这个环境变量,可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖系统的函数库。
以bear为例,可以基于 LD_PRELOAD 捕获命令,通过自己的命令替换原始编译命令方式,记录编译命令。
参考
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)