SVNでソースのVisual Studioファイルを生成するためにCMakeを使用します。現在、私のツールでは、いくつかのDLLファイルが実行可能ファイルと同じフォルダーにある必要があります。DLLファイルはソースと一緒のフォルダーにあります。
CMakeLists.txt
を変更して、生成されたVisual Studioプロジェクトのリリース/デバッグフォルダーに特定のDLL=)ファイルが既にあるか、コンパイル時にコピーされるようにする方法を教えてください。
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>)
これらの行を最上位のCMakeLists.txtファイルに入れます。 CMakeによってコンパイルされたすべてのライブラリと実行可能ファイルはビルドディレクトリの最上位に配置されるため、実行可能ファイルはライブラリを見つけることができ、すべてを簡単に実行できます。
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
これは、プロジェクトのソースディレクトリからプリコンパイルされたバイナリをコピーするというOPの問題を解決しないことに注意してください。
受け入れられた回答への補遺、別の回答として追加されたので、コードのフォーマットを取得します。
同じプロジェクトで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プロジェクト生成時に解決され、常にデフォルトのままであるためです。
これはそのうちの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)
おそらく カスタムターゲットを追加 が必要で、実行可能なターゲットの1つに依存させる必要があります。上記の機能を使用してファイルをコピーするには
COMMAND ${CMAKE_PROGRAM} -E copy_if_different ${CMAKE_BINARY_DIR}/path/to/file.dll ${CMAKE_BINARY_DIR}/where/to/put/file.dll
。
コマンド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})