web-dev-qa-db-ja.com

CMakeを使用して、DLL=ファイルを実行可能ファイルと同じフォルダーにコピーする方法は?

SVNでソースのVisual Studioファイルを生成するためにCMakeを使用します。現在、私のツールでは、いくつかのDLLファイルが実行可能ファイルと同じフォルダーにある必要があります。DLLファイルはソースと一緒のフォルダーにあります。

CMakeLists.txtを変更して、生成されたVisual Studioプロジェクトのリリース/デバッグフォルダーに特定のDLL=)ファイルが既にあるか、コンパイル時にコピーされるようにする方法を教えてください。

83
Mat

add_custom_commandとともにこれを達成するには、cmake -E copy_if_different...を使用します。完全な情報の実行

cmake --help-command add_custom_command
cmake -E


したがって、あなたの場合、次のディレクトリ構造がある場合:

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

コマンドが適用されるCMakeターゲットがMyTestの場合、次を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>)
109
Fraser

これらの行を最上位のCMakeLists.txtファイルに入れます。 CMakeによってコンパイルされたすべてのライブラリと実行可能ファイルはビルドディレクトリの最上位に配置されるため、実行可能ファイルはライブラリを見つけることができ、すべてを簡単に実行できます。

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

これは、プロジェクトのソースディレクトリからプリコンパイルされたバイナリをコピーするというOPの問題を解決しないことに注意してください。

17
David Grayson

受け入れられた回答への補遺、別の回答として追加されたので、コードのフォーマットを取得します。

同じプロジェクトでdllをビルドしている場合、通常はRelease、Debugなどのディレクトリにあります。 Visual Studio環境変数を使用して、それらを正しくコピーする必要があります。例えば。:

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

ソースと

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

目的地のため。エスケープに注意してください!

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

5
Dana Robinson

これはそのうちの1つに役立ちます

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

おそらく カスタムターゲットを追加 が必要で、実行可能なターゲットの1つに依存させる必要があります。上記の機能を使用してファイルをコピーするには

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

1
arrowd

コマンドfind_libraryを使用することもできます。

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

たとえば、EXECUTABLE_PATHが定義されている場合:

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

実行可能ファイルに必要な.dllファイルを移動できます。

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