如何通过CMake调整目标文件安装路径、命名及导出集配置
CMake目标库安装路径与命名调整方案
当前CMake配置
目标库定义
add_library( librevolta_runtime_x86 OBJECT crt0.S crti.S crtn.S ) install( TARGETS librevolta_runtime_x86 EXPORT revolta OBJECTS DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" )
静态库依赖配置
add_library( revolta STATIC ) target_link_libraries( revolta PUBLIC librevolta-runtime-x86 ) # 安装头文件与静态库 install( TARGETS revolta EXPORT revolta FILE_SET HEADERS DESTINATION "${CMAKE_INSTALL_PREFIX}/include" ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" ) # 导出目标配置 install( EXPORT revolta DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/revolta" )
当前安装结果
<CMAKE_INSTALL_PREFIX>/lib/objects-Debug/librevolta-runtime-x86/crt0.S.obj <CMAKE_INSTALL_PREFIX>/lib/objects-Debug/librevolta-runtime-x86/crti.S.obj <CMAKE_INSTALL_PREFIX>/lib/objects-Debug/librevolta-runtime-x86/crtn.S.obj
期望安装结果
<CMAKE_INSTALL_PREFIX>/lib/crt0.o <CMAKE_INSTALL_PREFIX>/lib/crti.o <CMAKE_INSTALL_PREFIX>/lib/crtn.o
需求
- 将目标文件从
*.S.obj重命名为*.o - 将所有目标文件直接安装至
<CMAKE_INSTALL_PREFIX>/lib目录 - 确保
librevolta_runtime_x86因依赖关系被加入revolta导出集
解决方法
1. 替换默认OBJECT目标安装规则,实现重命名与路径调整
CMake默认的OBJECT目标安装会生成嵌套路径和带冗余后缀的文件名,通过自定义install(FILES)规则结合生成器表达式手动处理:
add_library( librevolta_runtime_x86 OBJECT crt0.S crti.S crtn.S ) # 自定义安装:复制目标文件到lib目录,并重命名为*.o install( FILES $<TARGET_OBJECTS:librevolta_runtime_x86> DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" RENAME $<PATH:GET_FILENAME,$<TARGET_OBJECTS:librevolta_runtime_x86>,NAME_WE>.o )
其中$<PATH:GET_FILENAME,...NAME_WE>会提取目标文件的无后缀核心名称(如crt0.S.obj提取为crt0),手动追加.o完成重命名。
2. 确保OBJECT目标被加入导出集
显式将OBJECT目标纳入revolta导出集,同时设置导出名称匹配链接时的目标名:
# 设置导出名称,与target_link_libraries中使用的名称一致 set_target_properties(librevolta_runtime_x86 PROPERTIES EXPORT_NAME librevolta-runtime-x86 ) # 将OBJECT目标加入revolta导出集 install( TARGETS librevolta_runtime_x86 EXPORT revolta )
完整修改后的CMake配置
add_library( librevolta_runtime_x86 OBJECT crt0.S crti.S crtn.S ) # 配置导出名称匹配链接目标名 set_target_properties(librevolta_runtime_x86 PROPERTIES EXPORT_NAME librevolta-runtime-x86 ) # 自定义安装规则:重命名并直接安装到lib目录 install( FILES $<TARGET_OBJECTS:librevolta_runtime_x86> DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" RENAME $<PATH:GET_FILENAME,$<TARGET_OBJECTS:librevolta_runtime_x86>,NAME_WE>.o ) # 将OBJECT目标加入导出集 install( TARGETS librevolta_runtime_x86 EXPORT revolta ) add_library( revolta STATIC ) target_link_libraries( revolta PUBLIC librevolta-runtime-x86 ) install( TARGETS revolta EXPORT revolta FILE_SET HEADERS DESTINATION "${CMAKE_INSTALL_PREFIX}/include" ARCHIVE DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" ) install( EXPORT revolta DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/revolta" )
说明
$<TARGET_OBJECTS:librevolta_runtime_x86>用于获取OBJECT目标生成的所有目标文件路径$<PATH:GET_FILENAME,...NAME_WE>是CMake 3.20+支持的生成器表达式,若使用更低版本CMake,可通过string(REPLACE)命令提前处理文件名,但推荐升级至3.20+以简化配置- 显式导出OBJECT目标可保证依赖关系在导出的CMake配置中正确传递
内容的提问来源于stack exchange,提问作者Martin Kopecký
相关产品推荐
相关产品推荐

