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})