生成compile_commands.json文件

​转载自:

生成compile_commands.json文件 - 时聆心语 (edward852.github.io)icon-default.png?t=LA92https://edward852.github.io/post/%E7%94%9F%E6%88%90compile_commands.json%E6%96%87%E4%BB%B6/

 compile_commands.json 文件能够有效提高一些工具(比如说ccls1, vscode2)的代码跳转、补全等功能。因此,本文将会说明如何生成 compile_commands.json 文件,特别是使用 makefile 的老工程。

cmake工程

cmake工程生成 compile_commands.json 文件比较简单,定义 CMAKE_EXPORT_COMPILE_COMMANDS 即可。

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1

makefile工程

不过很多(旧的)工程都是用 makefile 来编译的,没有现成的选项生成 compile_commands.json 文件。
虽然也可以使用 ctags, gtags 等,但是跳转其实不是很准确。
我们可以通过 Bear 来生成,而且不需要改动代码。
具体Bear的安装这里就不赘述了,按照 官方文档 来即可。
安装之后,执行以下命令即可生成:

bear 编译命令
# 比如说 bear make

也就是在原有编译命令之前加上 bear 即可,一般都是 bear make 。
生成之后我们就可以愉快地享受更精准的跳转和补全了。😊 ✌️

非原编译环境调整

有的时候不同模块使用的编译环境是不同的,但是想在同一开发机上编码?
其中一种方法是远程开发(比如说vscode remote3),另外一种就是使用 docker 。
代码checkout在同一台开发机,不同编译环境对应不同docker镜像,代码以volume挂载。
这样可以避免编译的交叉影响,省去代码的同步以及日后编译机的裁撤。

不过编译环境的库依赖可能会冲突,所以在开发机上需要存放到不同的目录。
因此生成的 compile_commands.json 文件中的路径需要调整。
我们先通过 -o 选项生成一个备份文件:

bear --append -o compile_commands_org.json 编译命令

然后通过 compile_cmds_replace.sh 脚本替换依赖路径。

#!/bin/bash

sed 's#/usr/local/svcfrm2#/data/dev-deps/XxxMod/svcfrm2#g' compile_commands_org.json > compile_commands.json
sed -i 's#/usr/local/commlib#/data/dev-deps/XxxMod/commlib#g' compile_commands.json

# -I单独一行,下一行还是-I
perl -i -0pe 's/"-I",\s+"-I/"-I/gms' compile_commands.json
# -I单独一行,下一行是绝对路径
perl -i -0pe 's/"-I",\s+"\//"-I\//gms' compile_commands.json
# -I单独一行,下一行是相对路径
perl -i -0pe 's/"-I",\s+"\./"-I\./gms' compile_commands.json

上面的脚本示例了如何把 XxxMod 依赖的库 svcfrm2 和 commlib 调整为开发机上对应库的路径。


  1. GitHub - MaskRay/ccls: C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlighting ↩︎
  2. https://code.visualstudio.com ↩︎
  3. Visual Studio Code Remote Development ↩︎

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值