Aby to osiągnąć, użyłbym add_custom_command
wraz z cmake -E copy_if_different...
. Dla pełnej informacji działać
cmake --help-command add_custom_command
cmake -E
Więc w twoim przypadku, jeśli mają następującą strukturę katalogów:
/CMakeLists.txt
/src
/libs/test.dll
i swój cel CUpewnij do którego komenda dotyczy to MyTest
, wtedy może dodać następujące elementy do pliku 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
Jeśli chcesz tylko całą zawartość katalogu /libs/
skopiowane, użyj 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>)
Jeśli trzeba skopiować różnych bibliotek DLL w zależności od konfiguracji (Release, Debug, np.) możesz mieć te w podkatalogach o odpowiedniej konfiguracji: /libs/Release
i /libs/Debug
. Następnie należy wstrzyknąć typ konfiguracji do ścieżki do biblioteki dll w zaproszeniu add_custom_command
, tak:
add_custom_command(TARGET MyTest POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
"${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
$<TARGET_FILE_DIR:MyTest>)
Szybka uwaga dla tego, co działało w moim przypadku na wypadek, gdyby pomógł komuś innemu w przyszłości: Mam projekt biblioteki statycznej, do której główny plik wykonywalny opcjonalnie się łączy, a biblioteka ta wymaga skopiowania biblioteki DLL, jeśli zostanie dodana. W pliku CMakeLists.txt tej biblioteki użyłem '$ {CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$' dla miejsca docelowego. W przeciwnym razie skopiowałby go do ścieżki budowania biblioteki, która była bezużyteczna. –
AberrantWolf