在编译某个 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 行:
第 113 行是报错的位置,往上查找看到第 104 行是在遍历一个叫 ${_include_dirs} 的变量,再往上查找看到第 96 行定义了该变量。变量就包含了 “CMake Error” 提到的 "/include" 地址。而我本地根目录下并没有 "include" 文件夹。
反过来在 ABC 包的 cmakelist 文件中找到可能出错的地方:
屏蔽第 66 行代码后重新编译 ABC 包,对应的 share 包中的 cmake 文件并没有更新,需要我们手动删除 ABC 包的 build 和 devel 中的缓存文件。然后再重新编译,此时的 ABC 的 cmake 文件变为这样:
图 fig.3 中,第 96 行的 ${_include_dirs} 变量的值已经改变了!已经没有 “/include” 路径。
编译 XYZ 包,还是有报错了。因为这么改 ABC 包的 cmakelist,会导致 ABC 包内的头文件无法被 XYZ 包引用!无奈只好恢复 ABC 的 cmakelist。再编译 ABC 包,看到其 cmake 文件如下:
对比图 fig.1 和图 fig.4 可以看出第 96 行的 ${_include_dirs} 变量值,由 “/include” 变为 "/usr/include"。虽然我也不知道是怎么回事 : )
假如说 ABC 的 cmake 文件没有发生变化,我们也完全可以直接把 ${_include_dirs} 中的 “/include” 值删除来解决问题!