通过生成的 cmake 文件反向排查 cmakelist 错误

在编译某个 ros 包,称为 XYZ 包,该包依赖另一个包,称为 ABC 包的头文件,出现了如下错误:

CMake Error at xxx/share/ABCConfig.cmake:113 (message):
Project 'xxx' specifies '/include' as an include dir, which is not found.  It does neither exist as an absolute directory nor in 'xxx//include'.

提示说 ABC 包需要的头文件的包含找不到。

在 "CMake Error" 提示的 ABC 包的 share 文件夹中找到出错的 cmake 文件第 113 行:

fig.1 ABC 包的 cmake

第 113 行是报错的位置,往上查找看到第 104 行是在遍历一个叫 ${_include_dirs} 的变量,再往上查找看到第 96 行定义了该变量。变量就包含了 “CMake Error” 提到的 "/include" 地址。而我本地根目录下并没有 "include" 文件夹。

反过来在 ABC 包的 cmakelist 文件中找到可能出错的地方:

fig.2 ABC 包的 cmakelist

屏蔽第 66 行代码后重新编译 ABC 包,对应的 share 包中的 cmake 文件并没有更新,需要我们手动删除 ABC 包的 build 和 devel 中的缓存文件。然后再重新编译,此时的 ABC 的 cmake 文件变为这样:

fig.3 ABC 包的 cmake

图 fig.3 中,第 96 行的 ${_include_dirs} 变量的值已经改变了!已经没有 “/include” 路径。

编译 XYZ 包,还是有报错了。因为这么改 ABC 包的 cmakelist,会导致 ABC 包内的头文件无法被 XYZ 包引用!无奈只好恢复 ABC 的 cmakelist。再编译 ABC 包,看到其 cmake 文件如下:

fig.4 ABC 包的 cmake

对比图 fig.1 和图 fig.4 可以看出第 96 行的 ${_include_dirs} 变量值,由 “/include” 变为 "/usr/include"。虽然我也不知道是怎么回事 : )

假如说 ABC 的 cmake 文件没有发生变化,我们也完全可以直接把 ${_include_dirs} 中的 “/include” 值删除来解决问题!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值