CMake: 「CMAKE_LINK_DEPENDS_NO_SHARED」を使わずに共有ライブラリ依存関係を管理する方法


CMAKE_LINK_DEPENDS_NO_SHARED は、CMake の変数です。この変数は、ターゲットがリンクする共有ライブラリファイルへの依存関係を無効にするかどうかを制御します。デフォルトでは、CMAKE_LINK_DEPENDS_NO_SHAREDFALSE に設定されており、ターゲットはリンクされたすべての共有ライブラリファイルに依存します。

詳細

CMAKE_LINK_DEPENDS_NO_SHAREDTRUE に設定すると、CMake はターゲットがリンクする共有ライブラリファイルへの依存関係を無効にします。つまり、共有ライブラリファイルが変更されても、ターゲットは再リンクされません。これは、共有ライブラリファイルが頻繁に変更される場合や、ターゲットのパフォーマンスに大きな影響を与えない場合に役立ちます。

使用方法

CMAKE_LINK_DEPENDS_NO_SHARED を使用するには、次のいずれかの方法で行うことができます。

  • ターゲットが作成される前に、CMAKE_LINK_DEPENDS_NO_SHARED 変数を TRUE に設定します。
set(CMAKE_LINK_DEPENDS_NO_SHARED TRUE)
add_executable(my_target my_target.cpp)
  • ターゲットのプロパティ LINK_DEPENDS_NO_SHAREDTRUE に設定します。
add_executable(my_target my_target.cpp)
set_target_properties(my_target PROPERTIES LINK_DEPENDS_NO_SHARED TRUE)

次の例では、my_target ターゲットが lib_shared.so 共有ライブラリファイルに依存しないように CMAKE_LINK_DEPENDS_NO_SHARED を使用する方法を示します。

set(CMAKE_LINK_DEPENDS_NO_SHARED TRUE)
add_executable(my_target my_target.cpp lib_shared.so)
  • CMAKE_LINK_DEPENDS_NO_SHARED は、CMake 3.2 以降でのみ使用できます。
  • CMAKE_LINK_DEPENDS_NO_SHARED を設定しても、ターゲットが共有ライブラリファイルのヘッダーファイルに依存している場合は、ターゲットは再リンクされます。


サンプル 1: ターゲットが作成される前に CMAKE_LINK_DEPENDS_NO_SHARED 変数を設定する

set(CMAKE_LINK_DEPENDS_NO_SHARED TRUE)

# ターゲット "my_target" を作成する
add_executable(my_target my_target.cpp)

サンプル 2: ターゲットのプロパティ LINK_DEPENDS_NO_SHARED を設定する

# ターゲット "my_target" を作成する
add_executable(my_target my_target.cpp)

# ターゲット "my_target" のプロパティ `LINK_DEPENDS_NO_SHARED` を TRUE に設定する
set_target_properties(my_target PROPERTIES LINK_DEPENDS_NO_SHARED TRUE)

このコードでは、add_executable コマンドを使用して my_target ターゲットを作成してから、set_target_properties コマンドを使用してターゲットのプロパティ LINK_DEPENDS_NO_SHAREDTRUE に設定します。この結果、my_target ターゲットはリンクされたすべての共有ライブラリファイルに依存しません。

# ターゲット "my_target" を作成する
add_executable(my_target my_target.cpp)

# ターゲット "my_target" のみが共有ライブラリファイルに依存しないように、
# ターゲット固有のスコープ内で `CMAKE_LINK_DEPENDS_NO_SHARED` を設定する
target_sources(my_target PRIVATE "my_target_private.cpp")
set_target_properties(my_target PROPERTIES LINK_DEPENDS_NO_SHARED TRUE)

# ターゲット "other_target" を作成する
add_executable(other_target other_target.cpp my_target_private.cpp)

このコードでは、my_target ターゲットのみが共有ライブラリファイルに依存しないように、ターゲット固有のスコープ内で CMAKE_LINK_DEPENDS_NO_SHARED を設定します。まず、my_target ターゲットのソースファイルを my_target_private.cpp に設定します。次に、set_target_properties コマンドを使用してターゲットのプロパティ LINK_DEPENDS_NO_SHAREDTRUE に設定します。



ターゲット固有のソースファイルを設定する

target_sources コマンドを使用して、ターゲット固有のソースファイルを定義できます。この方法では、共有ライブラリファイルに依存しないソースファイルのみをターゲットに含めることができます。

add_executable(my_target my_target.cpp)

target_sources(my_target PRIVATE "my_target_private.cpp")

このコードでは、my_target ターゲットのソースファイルを my_target_private.cpp に設定します。この結果、my_target ターゲットは my_target_private.cpp ファイルのみをビルドし、リンクされます。

ターゲット固有のライブラリを設定する

target_link_libraries コマンドを使用して、ターゲット固有のライブラリを定義できます。この方法では、共有ライブラリファイルではなく、静的ライブラリファイルにターゲットをリンクできます。

add_executable(my_target my_target.cpp)

add_library(my_target_static my_target_static.cpp)
target_link_libraries(my_target my_target_static)

このコードでは、my_target_static という名前の静的ライブラリを作成し、my_target ターゲットをそのライブラリにリンクします。この結果、my_target ターゲットは共有ライブラリファイルではなく、my_target_static ライブラリにリンクされます。

外部コマンドを使用する

execute_process コマンドを使用して、外部コマンドを実行できます。この方法では、カスタムスクリプトを使用してターゲットの依存関係を管理できます。

add_executable(my_target my_target.cpp)

execute_process(COMMAND my_target_dependencies.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

このコードでは、my_target_dependencies.sh という名前のスクリプトを実行します。このスクリプトは、my_target ターゲットの依存関係を管理します。

CMake のカスタムモジュールを使用する

CMake には、ターゲットの依存関係を管理するためのカスタムモジュールがいくつかあります。これらのモジュールを使用して、CMAKE_LINK_DEPENDS_NO_SHARED 変数よりも柔軟な方法で依存関係を制御できます。

プラットフォーム固有のツールを使用する

一部のプラットフォームには、ターゲットの依存関係を管理するための独自のツールがあります。これらのツールを使用して、CMAKE_LINK_DEPENDS_NO_SHARED 変数よりもプラットフォーム固有の方法で依存関係を制御できます。

これらの代替方法はそれぞれ長所と短所があり、プロジェクトの要件に応じて最適な方法を選択する必要があります。

  • 一部の代替方法は、プラットフォームに依存する場合があります。
  • 上記の代替方法はすべて、CMAKE_LINK_DEPENDS_NO_SHARED 変数よりも複雑になる可能性があります。