add_library
によって作成された.soライブラリターゲットがあり、このライブラリへの絶対パスを外部スクリプトに渡す必要があります。これで${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}LangShared${CMAKE_SHARED_LIBRARY_SUFFIX}
ができました(LIBRARY_OUTPUT_PATH
はCMakeLists.txt
で定義されています)。これはハードコーディングのように見えます。ターゲットの名前が変更されるか、そのプロパティの一部が変更されるとすぐに壊れてしまうからです。 add_library
の出力への絶対パスを取得する方法はありますか?
これには generator expression を使用する必要があります。
add_custom_command
およびジェネレーター式のドキュメント:
COMMAND
の引数には「ジェネレーター式」を使用できます...ジェネレーター式は、ビルドシステムの生成中に評価され、各ビルド構成に固有の情報を生成します。
この場合、ライブラリターゲットが「MyLib」と呼ばれると仮定すると、ビルドされたライブラリへのフルパスを表すジェネレータ式は次のようになります。
$<TARGET_FILE:MyLib>
試してください:
_get_property(fancy_lib_location TARGET fancy_lib PROPERTY LOCATION)
message (STATUS "fancy_lib_location == ${fancy_lib_location}")
_
ここで、_fancy_lib
_はadd_library (fancy_lib SHARED ...)
で作成されたターゲットです。
Makefileジェネレーターで直接動作することがわかりましたが、_fancy_lib_location
_の値が期待したものではないため、Visual Studioジェネレーターに対して行うべき作業がさらにあります。
fancy_lib_location
_には、Visual Studio固有の$(OutDir)
参照への埋め込み参照が含まれます。この参照は、_CMAKE_BUILD_TYPE
_ CMake変数の値で置き換える必要があります(Debug
、またはRelease
)。CMAKE_DEBUG_POSTFIX
_変数を設定している場合は、値にnotが含まれます(これは、またはバグではない、私は知らない)。@bgooddrによる答えを拡張するために、ターゲットの場所を取得するCMake関数を以下に示します。
function(get_fancy_lib_location)
set(options)
set(multiValueArgs LIB)
set(oneValueArgs LOCATION)
cmake_parse_arguments(get_fancy_lib_location "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
message (STATUS "fancy_lib == ${get_fancy_lib_location_LIB}")
get_property(fancy_lib_location TARGET "${get_fancy_lib_location_LIB}" PROPERTY LOCATION)
message (STATUS "fancy_lib_location == ${fancy_lib_location}")
set(${get_fancy_lib_location_LOCATION} ${fancy_lib_location})
endfunction()