Come copiare i file DLL nella stessa cartella del file eseguibile utilizzando CMake?

Usiamo CMake per la generazione di Visual Studio file delle nostre fonti in nostro SVN. Ora il mio strumento necessita di alcuni file DLL nella stessa cartella dell’eseguibile. La DLL file sono in una cartella a fianco di origine.

Come posso modificare il mio CMakeLists.txt tale che il generato progetto di Visual Studio, hanno già il particolare file DLL nel rilascio/debug cartelle o li copia su compilation?

InformationsquelleAutor Mat | 2012-05-20

 

6 Replies
  1. 109

    Mi piacerebbe utilizzare add_custom_command per realizzare questo insieme con cmake -E copy_if_different.... Per info complete eseguire

    cmake --help-command add_custom_command
    cmake -E
    

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

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

    e il CMake target a cui il comando si applica è MyTest, allora si potrebbe aggiungere il seguente 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
    

    Se si desidera solo l’intero contenuto del /libs/ directory copiare, utilizzare 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>)
    

    Se avete bisogno di copiare dll diverse a seconda della configurazione (Versione di Debug, ad esempio), allora si potrebbe avere queste nelle sottodirectory denominata con la configurazione corrispondente: /libs/Release, e /libs/Debug. È quindi necessario inserire il tipo di configurazione nel percorso della dll in add_custom_command chiamata, come questo:

    add_custom_command(TARGET MyTest POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory
            "${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
            $<TARGET_FILE_DIR:MyTest>)
    
    • Breve nota per ciò che ha funzionato nel mio caso, nel caso in cui aiuta qualcun altro in futuro: ho un progetto di libreria statica che l’eseguibile principale facoltativamente link contro, e che la biblioteca richiede una DLL da copiare se aggiunto. Così in quella libreria CMakeLists.txt il file che ho usato ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$<CONFIG> per il target di destinazione. In caso contrario, sarebbe copiare la libreria di costruire percorso, che è stato inutile.
    • non è l’obiettivo di cmake install() direttive per montare i binari? O forse cmake LIBRARY cose? Io non so davvero la toolchain.
    • $<TARGET_FILE_DIR:MyTest> – che cosa è? Come stampare le informazioni, che cosa significano esattamente
    • A meno che mi sono perso qualcosa, quando mi è stata quella di integrare il comando di questo metodo non funziona per aggiunta di librerie con IMPORTED_LIBRARIES. Si lamenta di non essere in grado di eseguire una post-build comando quando nulla è stato costruito.
    • Durante il test e sollecitando il mio cmake: Se si utilizza IMPORTED librerie, e la necessità di dover trasferire la Dll, è necessario utilizzare una variante di comando. Se hai aggiunto il tuo IMPORTED biblioteca MyImportedLib utilizzare COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:MyImportedLib> $<TARGET_FILE_DIR:MyTest> di Notare che per eseguire più post comandi di compilazione avete bisogno di tutto rilegato in un comando personalizzato ad esempio add_custom_command(TARGET MyTest POST_BUILD COMMAND #your first command# COMMAND #Your second command#)
  2. 17

    Ho messo queste righe nella mia top-level CMakeLists.txt file. Tutte le librerie ed eseguibili compilati da CMake saranno collocati nel livello superiore della directory di compilazione, in modo che i file eseguibili possono trovare le librerie ed è facile per eseguire il tutto.

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

    Di notare che questo non risolve il po, il problema della copia dei binari precompilati del progetto, della directory di origine.

  3. 5

    Un addendum al accettati risposta, aggiunto come una risposta separati in modo da ottenere il codice di formattazione:

    Se stai costruendo la tua dll nel progetto stesso, che di solito essere in Rilascio, Debug, ecc. le directory. Dovrete usare il Visual Studio le variabili di ambiente per copiare correttamente li. ad esempio:

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

    per l’origine e

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

    per la destinazione. Nota la fuoriuscita di!

    Non è possibile utilizzare il CMake CMAKE_BUILD_TYPE variabile per la configurazione poiché è risolto al VS progetto tempo di generazione e sarà sempre quello predefinito è.

    • L’ultima parte del accettati risposta indirizzi di questo pulite CMake modo, l’utilizzo di $<CONFIGURATION>
  4. 2

    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)
    
  5. 1

    Probabilmente è necessario aggiungi personalizzato di destinazione e rendere dipendono l’uno dell’eseguibile obiettivi. Per copiare i file utilizzando la funzione precedente uso

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

  6. 1

    È anche possibile utilizzare il comando find_library:

    find_library(<some_var> NAMES <name_of_lib> PATHS "<path/to/lib>")
    

    Con un definito EXECUTABLE_PATH, per esempio:

    set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    

    è in grado di muoversi .dll file eseguibile bisogno, con

    file(COPY ${<some_var>}
        DESTINATION ${EXECUTABLE_OUTPUT_PATH})
    

Lascia un commento