Я бы использовал 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>
для целевого назначения. В противном случае он скопировал бы его в путь сборки библиотеки, что было бесполезно.install()
директив cmake является сборка двоичных файлов? Или может что-то делатьLIBRARY
? Я действительно не знаю набор инструментов.$<TARGET_FILE_DIR:MyTest>
- что это? Как распечатать информацию, что именно означаетIMPORTED_LIBRARIES
. Он жалуется на то, что не может запустить команду после сборки, когда ничего не построено.IMPORTED
библиотеки и вам нужно переместить библиотеки DLL, вам нужно использовать вариантную команду. Если вы добавили своюIMPORTED
библиотеку, какMyImportedLib
вы бы использовали,COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:MyImportedLib> $<TARGET_FILE_DIR:MyTest>
обратите внимание, что для запуска нескольких команд пост-сборки вам нужно, чтобы все они были связаны в одну пользовательскую команду, напримерadd_custom_command(TARGET MyTest POST_BUILD COMMAND #your first command# COMMAND #Your second command#)
Я помещаю эти строки в свой файл CMakeLists.txt верхнего уровня. Все библиотеки и исполняемые файлы, скомпилированные CMake, будут размещены на верхнем уровне каталога сборки, чтобы исполняемые файлы могли находить библиотеки и легко запускать все.
Обратите внимание, что это не решает проблему OP по копированию предварительно скомпилированных двоичных файлов из исходного каталога проекта.
источник
У меня возникла эта проблема сегодня, когда я пытался сделать сборку Windows для моей программы. И в итоге я сам провел небольшое исследование, поскольку все эти ответы меня не удовлетворили. Было три основных вопроса:
Я хотел, чтобы отладочные сборки были связаны с отладочными версиями библиотек, а выпускные сборки были связаны с выпускными сборками библиотек соответственно.
В дополнение к этому я хотел, чтобы правильные версии файлов DLL (Debug / Release) копировались в выходные каталоги.
И я хотел добиться всего этого без написания сложных и хрупких скриптов.
После просмотра некоторых руководств по CMake и некоторых многоплатформенных проектов на github я нашел это решение:
Объявите свою библиотеку как цель с атрибутом «IMPORTED», укажите ее отладку и выпустите файлы .lib и .dll.
Свяжите эту цель с вашим проектом как обычно
Сделайте настраиваемый шаг сборки, чтобы скопировать файл DLL в место назначения, если он был каким-то образом изменен с момента предыдущей сборки
источник
Дополнение к принятому ответу, добавленное как отдельный ответ, поэтому я получаю форматирование кода:
Если вы создаете свои библиотеки DLL в одном проекте, они обычно находятся в каталогах Release, Debug и т. Д. Вам нужно будет использовать переменные среды Visual Studio, чтобы правильно их скопировать. например:
для источника и
для пункта назначения. Обратите внимание на побег!
Вы не можете использовать переменную CMake CMAKE_BUILD_TYPE для конфигурации, поскольку она разрешается во время генерации проекта VS и всегда будет тем, что по умолчанию.
источник
$<CONFIGURATION>
Вы также можете использовать команду find_library:
С определенным EXECUTABLE_PATH, например:
вы можете переместить файлы .dll, которые нужны вашему исполняемому файлу, с помощью
источник
Это полезно для одного из них
источник
Вероятно, вам нужно добавить настраиваемую цель и сделать ее зависимой от одной из ваших исполняемых целей.
Чтобы скопировать файл с помощью вышеуказанной функции, используйте:
источник
Я новичок в CMake, но все же хотел поделиться своим опытом. В моем случае мне нужна была копия после установки, чтобы все мои двоичные файлы были внутри. В случае стороннего двоичного файла, который можно импортировать в CMake, для меня работает следующее:
Очевидно, что IMPORTED_LOCATION_RELEASE может иметь варианты в зависимости от того, как была собрана / установлена разделяемая библиотека. Может быть IMPORTED_LOCATION_DEBUG.
Может, есть лучший способ получить это название свойства, я не знаю.
источник
Перемещение файлов во время сборки с помощью
install
У меня возникла эта проблема, когда я пытался следовать официальному руководству CMake на шаге 9 . Это было местоположение файла, который я хотел переместить:
Это было то место, где я хотел, чтобы файл находился:
Поскольку эта DLL была сгенерирована как общая библиотека, все, что я сделал, - это включил эту строку
CMakeLists.txt
в подкаталог , содержащий исходный код библиотеки.src/Mathfunctions/CMakeLists.txt
Благодаря вашим ответам я смог подумать над этим. Это всего лишь одна строка, так что я думаю, что это нормально.
$<CONFIG>
Может иметь два значения Debug или Release В зависимости от того, как строится проект, как это требуется оригинальный вопрос.источник