Как скопировать DLL файлы в ту же папку, что и исполняемый файл с помощью CMake?
мы используем CMake для создания файлов Visual Studio наших источников в нашем SVN. Теперь мой инструмент требует, чтобы некоторые DLL-файлы находились в той же папке, что и исполняемый файл. Файлы DLL находятся в папке рядом с источником.
Как я могу изменить мой CMakeLists.txt таким образом, что сгенерированный проект Visual Studio будет либо уже иметь определенные DLL-файлы в папках release/debug, либо будет копировать их при компиляции?
6 ответов:
Я хотел бы использовать
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, eg), то вы можете иметь их в подкаталогах с именем соответствующей конфигурации:
/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>)
я помещаю эти строки в мои CMakeLists верхнего уровня.txt-файл. Все библиотеки и исполняемые файлы будут размещены на верхнем уровне каталога сборки, так что исполняемые файлы могут найти библиотеки, и это легко запустить все.
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
добавление к принятому ответу, добавленное как отдельный ответ, поэтому я получаю форматирование кода:
Если вы создаете свои библиотеки DLL в одном проекте, они обычно будут в выпуске, отладке и т. д. справочники. Для их правильного копирования необходимо использовать переменные среды Visual Studio. например:
"${PROJECT_BINARY_DIR}/your_library/$\(Configuration\)/your_library.dll"для источника и
"${CMAKE_CURRENT_BINARY_DIR}/$\(Configuration\)/your_library.dll"для назначения. Обратите внимание на побег!
вы не можете использовать переменную CMake CMAKE_BUILD_TYPE для конфигурация, так как она разрешена во время создания проекта VS и всегда будет независимо от значения по умолчанию.
Это полезно для одного из них
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib CACHE PATH "Directory where all the .lib files are dumped." FORCE) SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin CACHE PATH "Directory where .exe and .dll files are dumped." FORCE)
вам, вероятно, нужно добавить пользовательский элемент и сделать это зависит от одного из ваших исполняемых целей. Для копирования файла с помощью вышеуказанной функции используйте
COMMAND ${CMAKE_PROGRAM} -E copy_if_different ${CMAKE_BINARY_DIR}/path/to/file.dll ${CMAKE_BINARY_DIR}/where/to/put/file.dll.
вы также можете использовать команду find_library:
find_library(<some_var> NAMES <name_of_lib> PATHS "<path/to/lib>")С ОПРЕДЕЛЕННЫМ EXECUTABLE_PATH, например:
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)вы могли перенести .dll-файлы, которые нужны вашему исполняемому файлу, с
file(COPY ${<some_var>} DESTINATION ${EXECUTABLE_OUTPUT_PATH})
Comments