CMake如何修改导出目标名称 为install目标设置别名适配两种引入方式?
CMake 导出目标时修改名称实现无冗余命名空间的解决方案
方案1:使用原生EXPORT_NAME属性(CMake 3.18+ 推荐)
CMake 3.18版本引入了目标属性EXPORT_NAME,专门用于指定目标导出时使用的名称,和项目内使用的原始目标名完全独立,完美匹配需求,实现代码如下:
add_library(component_subcomponent_mocks ...) # 设置导出时使用的短名称,替换原始目标名 set_target_properties(component_subcomponent_mocks PROPERTIES EXPORT_NAME mocks ) # 项目内添加别名,保证add_subdirectory引入时也可以统一使用命名空间写法 add_library(component::subcomponent::mocks ALIAS component_subcomponent_mocks) # 原有install逻辑无需修改 install( TARGETS component_subcomponent_mocks EXPORT FindComponentSubcomponentMocks ARCHIVE DESTINATION lib PUBLIC_HEADER DESTINATION include ) install( EXPORT FindComponentSubcomponentMocks NAMESPACE component::subcomponent:: DESTINATION cmake )
该方案下:
- 项目内通过
add_subdirectory引入时,原始目标名component_subcomponent_mocks全局唯一无冲突,同时可以直接使用component::subcomponent::mocks别名 - 外部
find_package导入时,目标名直接为component::subcomponent::mocks,无冗余前缀
方案2:自定义Config文件补充别名(兼容低版本CMake)
如果你需要兼容3.18以下的CMake版本,可以通过手动编写Config模板文件的方式添加别名,步骤如下:
- 保留原有目标定义和
install(TARGETS)逻辑,同时添加项目内别名
add_library(component_subcomponent_mocks ...) add_library(component::subcomponent::mocks ALIAS component_subcomponent_mocks) install( TARGETS component_subcomponent_mocks EXPORT ComponentSubcomponentMocksTargets ARCHIVE DESTINATION lib PUBLIC_HEADER DESTINATION include )
- 生成中间Targets导出文件
install( EXPORT ComponentSubcomponentMocksTargets NAMESPACE component::subcomponent:: DESTINATION cmake )
- 新建
ComponentSubcomponentMocksConfig.cmake.in模板文件,内容如下:
include("${CMAKE_CURRENT_LIST_DIR}/ComponentSubcomponentMocksTargets.cmake") # 为导出的长名称目标添加短别名 if(NOT TARGET component::subcomponent::mocks) add_library(component::subcomponent::mocks ALIAS component::subcomponent::component_subcomponent_mocks) endif()
- 配置并安装Config文件
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/ComponentSubcomponentMocksConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/ComponentSubcomponentMocksConfig.cmake @ONLY ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/ComponentSubcomponentMocksConfig.cmake DESTINATION cmake )
该方案下使用逻辑和方案1完全一致,仅需要额外维护一个Config模板文件。
内容的提问来源于stack exchange,提问作者Maciej Załucki
相关产品推荐
相关产品推荐

