CMakeスクリプトで次のように指定して、構成に応じて異なる名前を取得する動的ライブラリがあります。
set_target_properties(${name} PROPERTIES OUTPUT_NAME ${outputName}64)
set_target_properties(${name} PROPERTIES DEBUG_OUTPUT_NAME ${outputName}64_d)
その結果、リリースビルドとデバッグビルドで別の名前が付けられます。ビルド後のステップとして、結果のライブラリを別のディレクトリにコピーしたいのですが、CMake-Fuのギフト(?)は本当にあなたに微笑みませんでした。
私はこれをやってみました:
GET_TARGET_PROPERTY(origfile mylibrary LOCATION)
STRING(REGEX REPLACE "/" "\\\\" origfile ${origfile})
set(targetfile my_target_path\\${CMAKE_CFG_INTDIR}\\)
STRING(REGEX REPLACE "/" "\\\\" targetfile ${targetfile})
add_custom_command(TARGET mylibrary POST_BUILD
COMMAND copy ${origfile} ${targetfile}
)
これはリリースビルドでは問題なく機能しますが、デバッグの場合、ソースには予想していた_dが含まれていません。 ファイルをコピーできるように、ターゲットの出力パスを取得するにはどうすればよいですか?
注:上記のスニペットからわかるように、これは現在Windows/Visual Studio用ですが、OS X/Xcode/makeでも動作するようにしたいと思います。
注:このライブラリに依存する他のいくつかのプロジェクトの出力ディレクトリとして機能する追加のディレクトリにライブラリを配置して、これらのプロジェクトが実行時にライブラリをロードできるようにする必要があります。許容できる代替ソリューションは、コピーを行うカスタムターゲットを作成できるようにすることです。これにより、他のプロジェクトがこのプロジェクトに依存し、このプロジェクトがライブラリに依存するようになります。
廃止されたLOCATION
プロパティを使用するのではなく、ジェネレータ式を使用することをお勧めします。
add_custom_command(TARGET mylibrary POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:mylibrary> ${targetfile}
)
また、コピーする代わりに、ターゲットプロパティRUNTIME_OUTPUT_DIRECTORY
を設定することで、ターゲットディレクトリに直接exeを生成することもできます。これには、構成ごとのオプションがあります(例:RUNTIME_OUTPUT_DIRECTORY_DEBUG
)。
set_target_properties(mylibrary PROPERTIES
RUNTIME_OUTPUT_DIRECTORY_DEBUG <debug path>
RUNTIME_OUTPUT_DIRECTORY_RELEASE <release path>
)
詳細については、次を実行:
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY"
cmake --help-property "RUNTIME_OUTPUT_DIRECTORY_<CONFIG>"
また、Windowsであっても、パスの区切り文字としてスラッシュを使用できる必要があります。
出力パスを手動で計算する代わりに、POST_BUILD
コマンドで ジェネレーター式 を使用します。これらは構成に対応しています。例:
add_custom_command(TARGET mylibrary POST_BUILD
COMMAND "${CMAKE_COMMAND}" -E copy
"$<TARGET_FILE:mylibrary>"
"my_target_path/$<CONFIGURATION>/$<TARGET_FILE_NAME:mylibrary>"
COMMENT "Copying to output directory")
他の答えは100%明確ではありませんでした...
実行可能ファイルを構築しているとしましょうtest_base.exe
、以下は実行可能ファイルをビルドし、.exeをベースの「ビルド」ディレクトリにコピーします。
add_executable(test_base "")
target_sources(test_base
PRIVATE
catch_main.cpp
catch_tests.cpp
sc_main.cpp
)
target_link_libraries(test_base PRIVATE Catch2 systemc)
add_custom_command(TARGET test_base POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:test_base> ${PROJECT_BINARY_DIR}/test_base.exe
COMMENT "Created ${PROJECT_BINARY_DIR}/test_base.exe"
)
したがって、この実行後のプロジェクトは次のようになります。
<project dir>/build/test_base.exe