如何将带命名空间的CMake构建库传递至子目录构建目标?
CMake父目录库以命名空间形式传递给子目录目标的实现方法
你当前的问题出在子目录中误用了find_package——这个命令是用来查找外部已安装的CMake包的,而父目录的库属于同一构建树内的目标,无需通过find_package查找。
要实现类似export(test as sub::test)的命名空间导出效果,最直接的方式是给目标创建带命名空间的别名,具体步骤如下:
父目录CMakeLists.txt修改
add_library(test test.cpp) # 为test库创建带命名空间的别名sub::test add_library(sub::test ALIAS test) add_subdirectory(main)
子目录main/CMakeLists.txt修改
add_executable(executable sub.cpp) # 直接使用别名链接目标,无需find_package target_link_libraries(executable PRIVATE sub::test)
补充说明
add_library(... ALIAS ...)是CMake 3.12及以上版本支持的语法,用于为现有目标创建别名,同一构建树内的子目录可以直接识别并使用这个别名。- 如果需要模拟“外部包”的使用方式(比如后续要安装库供其他项目使用),可以结合
install、export和configure_package_config_file,但同一构建树内的场景完全没必要这么复杂,用别名是最高效的方案。
内容的提问来源于stack exchange,提问作者Klaus
相关产品推荐
相关产品推荐

