CMake中如何为已使用无关键字target_link_libraries的目标配置INTERFACE包含目录?
核心思路是让pcl目标自动把flann的依赖(头文件、库)传递给上层的my.exe,绕开target_link_libraries的关键字冲突问题,具体有以下几种可行方案:
直接添加INTERFACE类型的flann头文件路径
既然问题的核心是my.exe找不到flann的头文件,直接在pcl的CMake配置中,将flann的包含目录以INTERFACE方式附加到pcl目标上即可。pcl本身依赖flann,肯定已经通过find_package获取到了FLANN_INCLUDE_DIRS变量,执行以下代码:target_include_directories(pcl INTERFACE ${FLANN_INCLUDE_DIRS})这样所有依赖pcl的目标(比如my.exe)都会自动继承这个包含目录,无需自己显式调用find_package(flann)。
若需链接flann库,补充INTERFACE链接属性
如果pcl还需要链接flann的库文件,除了头文件,还要把flann的库添加到pcl的INTERFACE链接属性中,避免my.exe手动链接。用set_target_properties追加配置,保留pcl原有的链接设置:set_target_properties(pcl PROPERTIES INTERFACE_LINK_LIBRARIES "$<TARGET_PROPERTY:pcl,INTERFACE_LINK_LIBRARIES>;${FLANN_LIBRARIES}" )这里的generator表达式会保留pcl原本的INTERFACE_LINK_LIBRARIES内容,再追加flann的库,不会覆盖原有配置。
备选方案:统一pcl的target_link_libraries调用关键字(需修改pcl源码)
如果允许修改pcl的CMake代码,找到pcl中链接flann的无关键字调用target_link_libraries(pcl flann),改成带PUBLIC关键字的形式:target_link_libraries(pcl PUBLIC flann)同时必须将pcl中所有其他无关键字的target_link_libraries调用都改为带PUBLIC/PRIVATE的形式(根据依赖是否需要传递给上层选择),确保所有调用统一使用关键字语法。这样my.exe只需链接pcl,就能自动继承flann的所有依赖。
内容的提问来源于stack exchange,提问作者Felix F Xu

