如何在CMake中仅将导入模块的头文件添加到库目标?
如何在CMake中仅获取Boost库的编译配置与头文件,而不链接库?
当然可以搞定!你想要的是给静态库添加Boost::filesystem的头文件路径和编译选项,但又不想把Boost库链接进去,还不想让后续依赖这个库的目标自动带上Boost依赖对吧?这里有两个简单的解决方案:
方案1:使用Boost官方提供的头文件专用导入目标
FindBoost模块其实自带了一个专门的导入目标Boost::headers,它只负责提供所有Boost头文件的路径和必要的编译定义,完全不涉及库链接。用它就很省事:
project(foo CXX) find_package(Boost REQUIRED COMPONENTS filesystem) add_library(foo STATIC foo.cpp) # 仅添加头文件路径和编译配置,无库链接 target_link_libraries(foo PRIVATE Boost::headers)
方案2:直接提取Boost::filesystem的编译属性
如果你只想针对Boost::filesystem的特定配置(而非所有Boost头文件),也可以手动提取Boost::filesystem导入目标的INTERFACE属性,直接应用到你的静态库:
project(foo CXX) find_package(Boost REQUIRED COMPONENTS filesystem) add_library(foo STATIC foo.cpp) # 导入Boost::filesystem的包含目录 target_include_directories(foo PRIVATE $<TARGET_PROPERTY:Boost::filesystem,INTERFACE_INCLUDE_DIRECTORIES>) # 导入Boost::filesystem的编译定义 target_compile_definitions(foo PRIVATE $<TARGET_PROPERTY:Boost::filesystem,INTERFACE_COMPILE_DEFINITIONS>) # 导入Boost::filesystem的编译选项 target_compile_options(foo PRIVATE $<TARGET_PROPERTY:Boost::filesystem,INTERFACE_COMPILE_OPTIONS>)
关键说明
PRIVATE关键字非常重要:它保证这些配置仅在编译你的静态库时生效,不会传递给任何依赖这个库的其他目标——完美避免了后续项目自动链接Boost的问题。- 静态库本身不会执行链接步骤,所以哪怕你直接写
target_link_libraries(foo PRIVATE Boost::filesystem),也不会把Boost的代码打包到你的静态库里。它只会帮你加好编译需要的头文件和选项,同时因为是PRIVATE,依赖也不会传递。要是你觉得这个写法更简洁,其实也完全符合你的需求。
内容的提问来源于stack exchange,提问作者E. Vakili
相关产品推荐
相关产品推荐

