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

vil*_*pam 26 xcode cmake post-build-event visual-studio

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

set_target_properties(${name} PROPERTIES OUTPUT_NAME ${outputName}64)
set_target_properties(${name} PROPERTIES DEBUG_OUTPUT_NAME ${outputName}64_d)
Run Code Online (Sandbox Code Playgroud)

最终结果是我在发布和调试版本上获得了不同的名称.我想将生成的库复制到另一个目录作为构建后的步骤,但是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}
)
Run Code Online (Sandbox Code Playgroud)

这适用于发布版本,但是对于调试,源代码不包括我期望的_d. 如何获取目标的输出路径以便我可以复制文件?

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

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

Fra*_*ser 44

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

add_custom_command(TARGET mylibrary POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mylibrary> ${targetfile}
)
Run Code Online (Sandbox Code Playgroud)

您也可以直接通过设置目标属性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>
)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请执

cmake --help-property "RUNTIME_OUTPUT_DIRECTORY"
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY_<CONFIG>"
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您的目标是Xcode或Visual Studio,则可能需要使用RUNTIME_OUTPUT_DIRECTORY,让IDE负责添加正确的配置.(正如你会发现你运行帮助cmd @Fraser一样) (2认同)

sak*_*kra 11

在命令中使用生成器表达式POST_BUILD而不是手动计算输出路径.这些是配置感知.例:

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")
Run Code Online (Sandbox Code Playgroud)


use*_*323 5

其他答案对我来说并不是100%清楚......

假设您正在构建一个可执行文件test_base.exe,以下命令将构建可执行文件,然后将 .exe 复制到基本“build”目录:

add_executable(test_base "")
target_sources(test_base
    PRIVATE
        catch_main.cpp
        catch_tests.cpp
        sc_main.cpp
)
target_link_libraries(test_base PRIVATE Catch2 systemc)

add_custom_command(TARGET test_base POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:test_base> ${PROJECT_BINARY_DIR}/test_base.exe
    COMMENT "Created ${PROJECT_BINARY_DIR}/test_base.exe"
)
Run Code Online (Sandbox Code Playgroud)

因此,运行后您的项目将具有:

<project dir>/build/test_base.exe