CMake: 「CMAKE_LINK_DEPENDS_NO_SHARED」を使わずに共有ライブラリ依存関係を管理する方法
CMAKE_LINK_DEPENDS_NO_SHARED
は、CMake の変数です。この変数は、ターゲットがリンクする共有ライブラリファイルへの依存関係を無効にするかどうかを制御します。デフォルトでは、CMAKE_LINK_DEPENDS_NO_SHARED
は FALSE
に設定されており、ターゲットはリンクされたすべての共有ライブラリファイルに依存します。
詳細
CMAKE_LINK_DEPENDS_NO_SHARED
を TRUE
に設定すると、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_SHARED
をTRUE
に設定します。
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_SHARED
を TRUE
に設定します。この結果、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_SHARED
を TRUE
に設定します。
ターゲット固有のソースファイルを設定する
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
変数よりも複雑になる可能性があります。