Как скопировать файлы DLL в ту же папку, что и исполняемый файл с помощью CMake?

Мы используем CMake для генерации файлов Visual Studio наших источников в нашем SVN. Теперь мой инструмент требует, чтобы некоторые DLL-файлы находились в той же папке, что и исполняемый файл. Файлы DLL находятся в папке рядом с источником.

Как я могу изменить свой CMakeLists.txt так, чтобы сгенерированный проект Visual Studio уже имел определенные DLL-файлы в выпуске /отладке папки или будут копировать их при компиляции?

81 голос | спросил Mat 20 Maypm12 2012, 12:24:10

6 ответов


0

Я бы использовал 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>)


Если вам нужно скопировать разные библиотеки в зависимости от конфигурации (например, 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>)
ответил Fraser 20 Maypm12 2012, 14:44:43
0

Я поместил эти строки в мой файл CMakeLists.txt верхнего уровня. Все библиотеки и исполняемые файлы будут размещены на верхнем уровне каталога сборки, чтобы исполняемые файлы могли находить библиотеки и легко запускать все.

set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
ответил David Grayson 24 ThuEurope/Moscow2015-12-24T02:21:22+03:00Europe/Moscow12bEurope/MoscowThu, 24 Dec 2015 02:21:22 +0300 2015, 02:21:22
0

Приложение к принятому ответу, добавленное в качестве отдельного ответа, поэтому я получаю форматирование кода:

Если вы собираете свои библиотеки в одном и том же проекте, они обычно находятся в каталогах Release, Debug и т. д. Вам придется использовать переменные среды Visual Studio, чтобы правильно их скопировать. например:.

"${PROJECT_BINARY_DIR}/your_library/\$\(Configuration\)/your_library.dll"

для источника и

"${CMAKE_CURRENT_BINARY_DIR}/\$\(Configuration\)/your_library.dll"

для пункта назначения. Обратите внимание на побег!

Вы не можете использовать переменную CMake CMAKE_BUILD_TYPE для конфигурации, так как она разрешена во время генерации проекта VS и всегда будет такой же, как по умолчанию.

ответил Dana Robinson 18 22014vEurope/Moscow11bEurope/MoscowTue, 18 Nov 2014 01:45:54 +0300 2014, 01:45:54
0

Это полезно для одного из них

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)
ответил Sai Kiran Nadipilli 19 J0000006Europe/Moscow 2015, 13:40:22
0

Возможно, вам нужно добавить пользовательскую цель и сделайте так, чтобы это зависело от одной из ваших исполняемых целей. Чтобы скопировать файл, используя вышеуказанную функцию, используйте

COMMAND ${CMAKE_PROGRAM} -E copy_if_different ${CMAKE_BINARY_DIR}/path/to/file.dll ${CMAKE_BINARY_DIR}/where/to/put/file.dll

ответил arrowd 20 Maypm12 2012, 12:31:58
0

Вы также можете использовать команду 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})
ответил Felipe Thorn 2 FebruaryEurope/MoscowbFri, 02 Feb 2018 21:23:43 +0300000000pmFri, 02 Feb 2018 21:23:43 +030018 2018, 21:23:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132