You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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ý

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:12:13