Я бы использовал add_custom_command
для этого вместе с cmake -E copy_if_different...
. Для полной информации бегите
cmake --help-command add_custom_command
cmake -E
Итак, в вашем случае, если у вас следующая структура каталогов:
/CMakeLists.txt
/src
/libs/test.dll
и ваша цель CMake, к которой применяется команда MyTest
, вы можете добавить следующее в свой CMakeLists.txt:
add_custom_command(TARGET MyTest POST_BUILD # Adds a post-build event to MyTest
COMMAND ${CMAKE_COMMAND} -E copy_if_different # which executes "cmake - E copy_if_different..."
"${PROJECT_SOURCE_DIR}/libs/test.dll" # <--this is in-file
$<TARGET_FILE_DIR:MyTest>) # <--this is out-file path
Если вы просто хотите /libs/
скопировать все содержимое каталога, используйте cmake -E copy_directory
:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs"
$<TARGET_FILE_DIR:MyTest>)
Если вам нужно скопировать разные библиотеки DLL в зависимости от конфигурации (например, Release, Debug), вы можете разместить их в подкаталогах, названных с соответствующей конфигурацией:, /libs/Release
и /libs/Debug
. Затем вам нужно ввести тип конфигурации в путь к dll в add_custom_command
вызове, например:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG>
для целевого назначения. В противном случае он скопировал бы его в путь сборки библиотеки, что было бесполезно.