我们知道target_include_directories对于某个库文件采用PUBLIC的模式添加搜索路径后,不仅这些搜索路径会添加到该库文件的编译过程中,也会添加到依赖该库文件的其他目标文件的编译过程中。
这方面知识这篇博客总结的不错target_include_directories与target_link_directories
但是我最近在构建某些项目的时候发现有时target_include_directories的这个性质好像不管用,仔细研究了下总结了一下需要注意的点。
1、目标名和库文件地址是不一样的
如下:
target_link_libraries(lifelong_backend PUBLIC
...
slam_pointcloud
)
slam_pointcloud是一个cmake的目标名,并不代表一个库路径,cmake在编译的时候会依据可见性从上文去找到slam_pointcloud所创建的地方获取它各种依赖项包括依赖的头文件路径,因此不能将slam_pointcloud写成一个库文件绝对路径,如:
target_link_libraries(lifelong_backend PUBLIC
...
/xxx/xxx/xxx/libslam_pointcloud.so
)
这样cmake并不知道libslam_pointcloud.so在创建时依赖什么,这样target_include_directories就失效了。
那么接下来就是要保证 1、目标名不能写错。 2、目标名是可见的。
2、target_link_libraries 里 目标名不能写错
注意target_link_libraries 里 目标名不能写错编译不会报错 !!! 这点是最坑的,至少在我这台计算机即使是乱写一个目标名cmake编译都不会报错
3、目标名可见性
可见性可以通过下面的代码测试出来
if(TARGET slam_pointcloud)
message(STATUS "Target exists.")
else()
message(FATAL_ERROR "Target does not exist.")
endif()
如果不可见,那么target_include_directories以PUBLIC模式添加的路径自然起不到作用,而且关键是即使是不可见或者写错了cmake都不会给你报错,然后最后告诉你头文件找不到,留你一人在电脑桌前抓耳挠腮。。。