Cmake 递归搜索头文件
若要对一个包含了多个子目录的目录中的每一个头文件都进行搜索和引用,会使用到file命令搜索。
// 搜索include文件夹下的头文件 将其目录存储到HEAD_LIST中。
file(GLOB_RECURSE HEAD_LIST ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp)
但实际上我们用message输出HEAD_LIST时,发现这些目录都是包含头文件名称的。
这样就没法用include_directories(${HEAD_LIST}) 语句快速包含头这些文件路径,因为这条语句只能识别到的路径末端为目录的路径,路径末端是文件名的路径无法识别。
head_LIST=
/home/xx/Software/ros2/test02/include/head01/heada.hpp
/home/xx/Software/ros2/test02/include/head02/headb.hpp
解决方法
在file语句中加入子语句 LIST_DIRECTORIES true ,这样HEAD_LIST将会包含这些文件的路径,但路径末端不是文件名而是最后一级的目录名称。
// 搜索include文件夹下的头文件 将其目录存储到HEAD_LIST中。
file(GLOB_RECURSE HEAD_LIST LIST_DIRECTORIES true ${CMAKE_CURRENT_SOURCE_DIR}/include/*.hpp)
可以用message查看HEAD_LIST:
head_LIST=
/home/xx/Software/ros2/test02/include/head01
/home/xx/Software/ros2/test02/include/head01/heada.hpp
/home/xx/Software/ros2/test02/include/head02
/home/xx/Software/ros2/test02/include/head02/headb.hpp
此时HEAD_LIST可以直接放到include_directories(${HEAD_LIST}) 里使用,实现了头文件的递归搜索。
参考文献:
[1] 许宏旭. CMake构建实战 项目开发卷[M]. 中国工信部出版社.