Come copiare i file DLL nella stessa cartella dell’eseguibile usando CMake?

Usiamo CMake per generare i file Visual Studio delle nostre fonti nel nostro SVN. Ora il mio strumento richiede che alcuni file DLL si trovino nella stessa cartella dell’eseguibile. I file DLL si trovano in una cartella accanto all’origine.

Come posso modificare il mio CMakeLists.txt tale che il progetto di Visual Studio generato abbia già i particolari file DLL nelle cartelle di rilascio / debug o li copi durante la compilazione?

add_custom_command per raggiungere questo objective insieme a cmake -E copy_if_different... Per informazioni complete run

 cmake --help-command add_custom_command cmake -E 

Quindi nel tuo caso, se hai la seguente struttura di directory:

 /CMakeLists.txt /src /libs/test.dll 

e il tuo target CMake a cui si applica il comando è MyTest , quindi puoi aggiungere quanto segue al tuo 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 $) # <--this is out-file path 

Se vuoi solo copiare l'intero contenuto della directory /libs/ , usa cmake -E copy_directory :

 add_custom_command(TARGET MyTest POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/libs" $) 

Se è necessario copiare dll diverse a seconda della configurazione (Release, Debug, ad esempio), è ansible avere queste sottodirectory con la configurazione corrispondente: /libs/Release e /libs/Debug . È quindi necessario inserire il tipo di configurazione nel percorso della DLL nella chiamata add_custom_command , in questo modo:

 add_custom_command(TARGET MyTest POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${PROJECT_SOURCE_DIR}/libs/$" $) 

Inserisco queste righe nel mio file CMakeLists.txt di primo livello. Tutte le librerie e gli eseguibili verranno collocati nel livello superiore della directory di build in modo che gli eseguibili possano trovare le librerie ed è facile eseguire tutto.

 set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) 

Un addendum alla risposta accettata, aggiunta come risposta separata in modo da ottenere la formattazione del codice:

Se stai creando le tue DLL nello stesso progetto, solitamente si trovano nelle directory Release, Debug, ecc. Dovrai utilizzare le variabili d’ambiente di Visual Studio per copiarle correttamente. per esempio:

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

per la fonte e

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

per la destinazione Nota l’evasione!

Non è ansible utilizzare la variabile CMAKEke CMAKE_BUILD_TYPE per la configurazione poiché è stata risolta durante la generazione del progetto VS e sarà sempre quella predefinita.

Probabilmente hai bisogno di aggiungere un target personalizzato e farlo dipendere da uno dei tuoi obiettivi eseguibili. Per copiare il file usando la funzione sopra riportata

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

Questo è utile per uno di loro

 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) 

Puoi anche usare il comando find_library:

 find_library( NAMES  PATHS "") 

Con un EXECUTABLE_PATH definito, ad esempio:

 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 

puoi spostare i file .dll di cui il tuo eseguibile ha bisogno, con

 file(COPY ${} DESTINATION ${EXECUTABLE_OUTPUT_PATH})