CMake:如何阻止target_link_libraries为静态库添加Visual Studio项目引用
解决方案
有两种成熟的实现方式,可根据你的CMake版本选择:
方案1:全版本兼容方案(CMake 3.14及以上支持)
核心逻辑是把编译期头文件依赖和链接期库依赖拆开,手动获取头文件目录避免依赖target_link_libraries的自动传递,链接时加LINK_ONLY修饰符取消项目引用生成。
配置示例:
target_include_directories( this_lib PUBLIC $<INSTALL_INTERFACE:include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> ${Boost_INCLUDE_DIRS} # 手动递归获取所有依赖库的公开头文件目录 $<TARGET_PROPERTY:lib1,INTERFACE_INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:lib2,INTERFACE_INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:lib4,INTERFACE_INCLUDE_DIRECTORIES> $<TARGET_PROPERTY:lib5,INTERFACE_INCLUDE_DIRECTORIES> ) target_link_libraries (this_lib PUBLIC # 仅添加链接依赖,不生成项目引用 $<LINK_ONLY:lib1> $<LINK_ONLY:lib2> $<LINK_ONLY:lib3> $<LINK_ONLY:lib4> $<LINK_ONLY:lib5> ${Boost_LIBRARIES} )
方案2:极简方案(CMake 3.18及以上支持)
CMake专门针对Visual Studio提供了控制项目依赖生成的目标属性,仅需加一行配置即可保留原有写法,同时取消自动项目引用:
# 原有配置完全保留,新增以下属性设置 set_target_properties(this_lib PROPERTIES VS_SKIP_AUTOMATIC_DEPENDENCIES TRUE)
注意事项
- 如果依赖的lib1~lib5有动态生成的头文件(如通过
configure_file、代码生成工具生成的头文件),需要手动添加编译顺序依赖:add_dependencies(this_lib lib1 lib2 lib3 lib4 lib5),避免编译this_lib时头文件尚未生成。 - 若项目需要支持install导出目标,方案2无需额外修改安装逻辑,适配成本更低。
内容的提问来源于stack exchange,提问作者Elad Maimoni
相关产品推荐
相关产品推荐

