[cmake] target_include_directories 以PUBLIC模式添加的路径为什么有时候无效

我们知道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都不会给你报错,然后最后告诉你头文件找不到,留你一人在电脑桌前抓耳挠腮。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值