如何在Linux CLI下用qmake-qt5生成compile_commands.json?
从qmake-qt5项目生成compile_commands.json的命令行方案
不用依赖GUI或第三方工具,直接基于qmake和shell脚本就能实现,以下是三种实用方案:
方案一:编译器包装脚本
- 创建一个捕获编译命令的shell脚本
gcc-wrapper.sh:
#!/bin/bash # 把编译命令写入临时文件 echo "{\"directory\":\"$(pwd)\",\"command\":\"$*\",\"file\":\"${@: -1}\"}" >> compile_commands.tmp # 执行实际编译 exec "$@"
- 给脚本添加执行权限:
chmod +x gcc-wrapper.sh
- 用包装后的编译器调用qmake并构建:
qmake-qt5 QMAKE_CXX="./gcc-wrapper.sh g++" QMAKE_CC="./gcc-wrapper.sh gcc" your_project.pro make clean && make
- 整理成标准JSON格式:
jq -s '.' compile_commands.tmp > compile_commands.json && rm compile_commands.tmp
方案二:修改Makefile批量记录
- 先生成默认Makefile:
qmake-qt5 your_project.pro
- 用sed修改Makefile,让所有编译命令自动写入JSON文件:
sed -i 's/^\(CXX\|CC\) = \(.*\)/\1 = \2 \&\& echo "{\"directory\":\"$(CURDIR)\",\"command\":\"$(subst ",\\",\0 $(CXXFLAGS) $(INCPATH) -c $< -o $@)\",\"file\":\"$<\"}" >> compile_commands.tmp/' Makefile
- 清理并重新构建:
make clean && rm -f compile_commands.tmp && make
- 格式化JSON:
jq -s '.' compile_commands.tmp > compile_commands.json && rm compile_commands.tmp
方案三:在.pro文件中添加自定义目标(推荐)
直接在项目的.pro文件末尾添加以下规则,让qmake生成专门的编译命令记录目标:
# 自定义生成compile_commands.json的目标 compile_commands.target = compile_commands.json compile_commands.commands = rm -f $$compile_commands.target; \ make CC=\"gcc \&\& echo \\\\{\\\"directory\\\\\":\\\"$$PWD\\\",\\\"command\\\\\":\\\"$(subst \",\\\\\",$(CC) $(CFLAGS) $(INCPATH) -c $< -o $@)\\\",\\\"file\\\\\":\\\"$<\\\"\\\\}\" >> $$compile_commands.target\" \ CXX=\"g++ \&\& echo \\\\{\\\"directory\\\\\":\\\"$$PWD\\\",\\\"command\\\\\":\\\"$(subst \",\\\\\",$(CXX) $(CXXFLAGS) $(INCPATH) -c $< -o $@)\\\",\\\"file\\\\\":\\\"$<\\\"\\\\}\" >> $$compile_commands.target\" compile_commands.depends = first QMAKE_EXTRA_TARGETS += compile_commands
之后只需执行以下命令即可生成:
qmake-qt5 your_project.pro make compile_commands jq -s '.' compile_commands.json > temp.json && mv temp.json compile_commands.json
注意事项
- 以上方案均需要
jq工具格式化JSON,Debian/Ubuntu系可通过sudo apt install jq安装,其他发行版用对应包管理器安装即可。 - 如果项目用clang编译,只需把脚本和规则中的
gcc/g++替换为clang/clang++即可。
内容的提问来源于stack exchange,提问作者Marcus Müller
相关产品推荐
相关产品推荐

