2012-05-20 5 views
65

私たちはSVNでソースのVisual Studioファイルを生成するためにCMakeを使用します。今では、私のツールは実行可能ファイルと同じフォルダにいくつかのDLLファイルを必要とします。 DLLファイルは、ソースの横のフォルダにあります。DLLファイルをCMakeを使って実行可能ファイルと同じフォルダにコピーするには?

CMakeLists.txtは、どのようにして生成されたVisual Studioプロジェクトがリリース/デバッグフォルダ内の特定のDLLファイルを持っているか、コンパイル時にコピーされるように変更できますか?

答えて

79

cmake -E copy_if_different...と一緒にこれを達成するには、add_custom_commandを使用します。

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

とコマンドが適用されるあなたのcmakeのターゲットがMyTestであるあなたは、その後、:あなたは次のディレクトリ構造を持っている場合、完全な情報については、お使いの場合にはそう

cmake --help-command add_custom_command 
cmake -E 


を実行します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 

コピーした/libs/ディレクトリの内容全体をしたい場合は
、使用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>) 

あなたは(リリース、デバッグ構成に応じて異なるDLLをコピーする必要がある場合
、たとえば、対応する設定で名前が付けられたサブディレクトリに/libs/Release/libs/Debugという名前のサブディレクトリを持つことができます。次に、このように、add_custom_command呼び出しにDLLへのパスに設定の種類を注入する必要があります。

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

私の場合は、将来的に他の人に役立ちます。私は、メインの実行可能ファイルがオプションでリンクしているスタティックライブラリプロジェクトを持っていて、そのライブラリは追加された場合にDLLをコピーする必要があります。したがって、そのライブラリのCMakeLists.txtファイルでは、私は '$ {CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$ 'をターゲットの宛先に使用しました。さもなければ、それは役に立たなかったライブラリ構築パスにそれをコピーします。 – AberrantWolf

1

おそらくadd custom targetになり、実行可能なターゲットの1つに依存するようにする必要があります。上記の関数を使用してファイルをコピーするには

COMMAND ${CMAKE_PROGRAM} -E copy_if_different ${CMAKE_BINARY_DIR}/path/to/file.dll ${CMAKE_BINARY_DIR}/where/to/put/file.dllを使用してください。

5

補遺を受け入れ答えに、私はコードの書式設定を取得して、別の答えとして追加:

同じプロジェクトでDLLを構築する場合、通常はリリース、デバッグなどのディレクトリにあります。 Visual Studio環境変数を正しくコピーするためには、それらを使用する必要があります。例えば:ソースと宛先の

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

ため

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

。エスケープすることに注意してください!

CMake CMAKE_BUILD_TYPE変数は、VSプロジェクトの生成時に解決され、常にデフォルトのものであるため、設定に使用することはできません。

+5

受け入れられた回答の最後の部分は、 '$ 'を使ってクリーナーCMakeの方法でこれを解決します –

1

これは私が私の最上位レベルのCMakeLists.txtファイルにこれらの行を入れて、それら

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

の一つのために有用です。すべてのライブラリと実行可能ファイルはビルドディレクトリの最上位に置かれ、実行ファイルはライブラリを見つけることができ、すべてを実行するのは簡単です。例えば、定義されたEXECUTABLE_PATHで

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

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) 

あなたと、あなたの実行ファイルが必要な.dllファイルを移動することができます。また、コマンドfind_libraryを使用することができます

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

file(COPY ${<some_var>} 
    DESTINATION ${EXECUTABLE_OUTPUT_PATH}) 
関連する問題