首页 文章

将目标文件复制到CMake中的后期构建步骤中的另一个位置

提问于
浏览
22

我有一个动态库,根据配置获取不同的名称,在CMake脚本中指定:

set_target_properties(${name} PROPERTIES OUTPUT_NAME ${outputName}64)
set_target_properties(${name} PROPERTIES DEBUG_OUTPUT_NAME ${outputName}64_d)

最终结果是我在发布和调试版本上获得了不同的名称 . 我想将生成的库复制到另一个目录作为构建后的步骤,但是CMake-Fu的礼物(?)并没有真正对你微笑 .

我试过这样做:

GET_TARGET_PROPERTY(origfile mylibrary LOCATION)
STRING(REGEX REPLACE "/" "\\\\" origfile ${origfile})

set(targetfile my_target_path\\${CMAKE_CFG_INTDIR}\\)
STRING(REGEX REPLACE "/" "\\\\" targetfile ${targetfile})

add_custom_command(TARGET mylibrary POST_BUILD
    COMMAND copy ${origfile} ${targetfile}
)

这适用于发布版本,但是对于调试,源代码不包括我期望的_d . How do I get the output path for the target so that I can copy the file?

Note: 从上面的代码片段可以看出,这是目前用于Windows / Visual Studio的,但我希望这也适用于OS X / Xcode / make .

Note: 我需要将库放在一个额外的目录中,该目录充当依赖于该库的其他几个项目的输出目录,以便这些项目能够在运行时加载库 . 另一种可接受的解决方案是能够创建执行复制的自定义目标,以便其他项目可以依赖于此项目,而该项目又取决于库 .

2 回答

  • 11

    而不是使用过时的 LOCATION 属性,而不是使用生成器表达式:

    add_custom_command(TARGET mylibrary POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mylibrary> ${targetfile}
    )
    

    您也可以直接通过设置目标属性 RUNTIME_OUTPUT_DIRECTORY 而不是复制它来在目标目录中生成exe . 这有每个配置选项(例如 RUNTIME_OUTPUT_DIRECTORY_DEBUG ) .

    set_target_properties(mylibrary PROPERTIES
                          RUNTIME_OUTPUT_DIRECTORY_DEBUG <debug path>
                          RUNTIME_OUTPUT_DIRECTORY_RELEASE <release path>
    )
    

    有关详细信息,请执

    cmake --help-property "RUNTIME_OUTPUT_DIRECTORY"
    cmake --help-property "RUNTIME_OUTPUT_DIRECTORY_<CONFIG>"
    

    此外,您应该能够在路径分隔符中使用正斜杠,即使在Windows上也是如此 .

  • 37

    POST_BUILD 命令中使用generator expressions而不是手动计算输出路径 . 这些是配置感知 . 例:

    add_custom_command(TARGET mylibrary POST_BUILD 
      COMMAND "${CMAKE_COMMAND}" -E copy 
         "$<TARGET_FILE:mylibrary>"
         "my_target_path/$<CONFIGURATION>/$<TARGET_FILE_NAME:mylibrary>" 
      COMMENT "Copying to output directory")
    

相关问题