132 votes

Comment copier des fichiers DLL dans le même dossier que l'exécutable à l'aide de CMake?

Nous utilisons CMake pour générer les fichiers Visual Studio de nos sources dans notre SVN. Maintenant, mon outil nécessite que certains fichiers DLL soient dans le même dossier que l'exécutable. Les fichiers DLL se trouvent dans un dossier à côté de la source.

Comment puis-je modifier mon CMakeLists.txt telle sorte que le projet Visual Studio généré aura déjà les fichiers DLL particuliers dans les dossiers release / debug ou les copiera lors de la compilation?

160voto

Fraser Points 20579

Je ne l'utiliserais add_custom_command pour atteindre cette cmake -E copy_if_different.... Pour plein d'infos exécuter

cmake --help-command add_custom_command
cmake -E


Donc dans votre cas, si vous avez la structure de répertoire suivante:

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

et votre CMake cible à laquelle la commande s'applique est - MyTest, alors vous pourriez ajouter ce qui suit à votre 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


Si vous voulez juste l'intégralité du contenu de l' /libs/ répertoire copié, utilisez 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>)


Si vous avez besoin de copier dll différentes selon la configuration (Libération, le Débogage, par exemple), alors vous pourriez avoir ces sous-répertoires nommés avec la configuration correspondante: /libs/Release, et /libs/Debug. Vous devez ensuite injecter le type de configuration dans le chemin de la dll à la add_custom_command appel, comme ceci:

add_custom_command(TARGET MyTest POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        "${PROJECT_SOURCE_DIR}/libs/$<CONFIGURATION>"
        $<TARGET_FILE_DIR:MyTest>)

2voto

arrowdodger Points 7611

Vous devrez probablement ajouter une cible personnalisée et la faire dépendre de l’une de vos cibles exécutables. Pour copier un fichier en utilisant la fonction ci-dessus, utilisez

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X