web-dev-qa-db-ja.com

ターゲット出力ファイルへのパス

add_libraryによって作成された.soライブラリターゲットがあり、このライブラリへの絶対パスを外部スクリプトに渡す必要があります。これで${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}LangShared${CMAKE_SHARED_LIBRARY_SUFFIX}ができました(LIBRARY_OUTPUT_PATHCMakeLists.txtで定義されています)。これはハードコーディングのように見えます。ターゲットの名前が変更されるか、そのプロパティの一部が変更されるとすぐに壊れてしまうからです。 add_libraryの出力への絶対パスを取得する方法はありますか?

44

これには generator expression を使用する必要があります。

add_custom_command およびジェネレーター式のドキュメント:

COMMANDの引数には「ジェネレーター式」を使用できます...

ジェネレーター式は、ビルドシステムの生成中に評価され、各ビルド構成に固有の情報を生成します。

この場合、ライブラリターゲットが「MyLib」と呼ばれると仮定すると、ビルドされたライブラリへのフルパスを表すジェネレータ式は次のようになります。

$<TARGET_FILE:MyLib>
46
Fraser

試してください:

_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ジェネレーターに対して行うべき作業がさらにあります。

  1. _fancy_lib_location_には、Visual Studio固有の$(OutDir)参照への埋め込み参照が含まれます。この参照は、_CMAKE_BUILD_TYPE_ CMake変数の値で置き換える必要があります(Debug、またはRelease)。
  2. 少なくともCMake 2.8.1および少なくともVisual Studioターゲットで、_CMAKE_DEBUG_POSTFIX_変数を設定している場合は、値にnotが含まれます(これは、またはバグではない、私は知らない)。
24
bgoodr

@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()
0
Blue7