CMake: ターゲットの直接リンク依存関係を制御する INTERFACE_LINK_LIBRARIES_DIRECT の詳細解説


CMake の "INTERFACE_LINK_LIBRARIES_DIRECT" プロパティは、ターゲットの直接リンク依存関係を指定するために使用されます。これは、ターゲットがビルドされるときに直接リンクされるライブラリを指定するものであり、間接的な依存関係は考慮されません。

用途

"INTERFACE_LINK_LIBRARIES_DIRECT" プロパティは、主に以下の用途で使用されます。

  • 循環依存関係の回避
    循環依存関係が発生する可能性がある場合に、依存関係を明確に定義することができます。
  • 依存関係の制御
    特定のライブラリが特定のターゲットにのみリンクされるように制限することができます。
  • 静的プラグインの注入
    静的ライブラリを別のターゲットに直接リンクすることで、そのライブラリをプラグインとして利用することができます。

使用方法

"INTERFACE_LINK_LIBRARIES_DIRECT" プロパティは、target_link_libraries() コマンドを使用して設定することができます。以下の例は、Foo ターゲットが FooPlugin ライブラリを直接リンクするように設定する方法を示しています。

target_link_libraries(Foo PRIVATE INTERFACE_LINK_LIBRARIES_DIRECT FooPlugin)

注意点

"INTERFACE_LINK_LIBRARIES_DIRECT" プロパティは、通常の依存関係管理とは異なり、高度な機能として使用されます。一般的には、target_link_libraries() コマンドを使用して通常の依存関係を管理することを推奨します。

以下の例は、"INTERFACE_LINK_LIBRARIES_DIRECT" プロパティを使用して静的プラグインを注入する方法を示しています。

# Foo ライブラリを定義する
add_library(Foo STATIC foo.c)

# FooPlugin ライブラリを定義する
add_library(FooPlugin STATIC foo_plugin.c)

# Foo ターゲットが FooPlugin ライブラリを直接リンクするように設定する
target_link_libraries(Foo PRIVATE INTERFACE_LINK_LIBRARIES_DIRECT FooPlugin)

# App ターゲットが Foo ライブラリをリンクする
add_executable(App app.c)
target_link_libraries(App Foo)

この例では、App ターゲットは Foo ライブラリをリンクしますが、FooPlugin ライブラリは直接リンクされません。これは、Foo ライブラリが FooPlugin ライブラリを内部的に使用しているためです。

"INTERFACE_LINK_LIBRARIES_DIRECT" プロパティは、CMake 3.3 以降で使用できます。古いバージョンの CMake を使用している場合は、代わりに INTERFACE_LINK_LIBRARIES プロパティを使用する必要があります。



# Foo ライブラリを定義する
add_library(Foo STATIC foo.c)

# FooPlugin ライブラリを定義する
add_library(FooPlugin STATIC foo_plugin.c)

# Foo ターゲットが FooPlugin ライブラリを直接リンクするように設定する
target_link_libraries(Foo PRIVATE INTERFACE_LINK_LIBRARIES_DIRECT FooPlugin)

# App ターゲットが Foo ライブラリをリンクする
add_executable(App app.c)
target_link_libraries(App Foo)

説明

このコードは、以下のことを行います。

  1. foo.c ファイルから Foo という名前の静的ライブラリを作成します。
  2. foo_plugin.c ファイルから FooPlugin という名前の静的ライブラリを作成します。
  3. Foo ターゲットが FooPlugin ライブラリを直接リンクするように設定します。これは、target_link_libraries() コマンドを使用して INTERFACE_LINK_LIBRARIES_DIRECT プロパティに FooPlugin を指定することで行われます。
  4. app.c ファイルから App という名前の実行可能ファイルを作成します。
  5. App ターゲットが Foo ライブラリをリンクするように設定します。これは、target_link_libraries() コマンドを使用して Foo を指定することで行われます。

実行結果

このコードを実行すると、以下のようになります。

  • App 実行可能ファイルが作成されます。
  • Foo ライブラリと FooPlugin ライブラリが作成されます。

App 実行可能ファイルを実行すると、Foo ライブラリと FooPlugin ライブラリが直接リンクされ、FooPlugin ライブラリの機能を利用することができます。

以下の例は、"INTERFACE_LINK_LIBRARIES_DIRECT" プロパティを使用して依存関係を制御する方法を示しています。

# Foo ライブラリを定義する
add_library(Foo STATIC foo.c)

# Bar ライブラリを定義する
add_library(Bar STATIC bar.c)

# Foo ターゲットが FooPlugin ライブラリを直接リンクするように設定する
target_link_libraries(Foo PRIVATE INTERFACE_LINK_LIBRARIES_DIRECT FooPlugin)

# App ターゲットが Foo ライブラリと Bar ライブラリをリンクする
add_executable(App app.c)
target_link_libraries(App Foo Bar)


代替方法

"INTERFACE_LINK_LIBRARIES_DIRECT" の代替方法として、以下の方法があります。

  • カスタムターゲット
    カスタムターゲットを使用して、複雑な依存関係を管理することができます。これは、高度なユースケースに適しています。
  • target_link_libraries() コマンド
    このコマンドを使用して、ターゲットの依存関係を個別に指定することができます。これは、より詳細な制御が必要な場合に役立ちます。
  • INTERFACE_LINK_LIBRARIES プロパティ
    これは、"INTERFACE_LINK_LIBRARIES_DIRECT" プロパティよりも古いバージョンの CMake で使用できる代替方法です。ただし、このプロパティは直接リンクと間接リンクの両方の依存関係を指定するため、"INTERFACE_LINK_LIBRARIES_DIRECT" プロパティよりも柔軟性に欠けます。

各方法の詳細

INTERFACE_LINK_LIBRARIES プロパティ

target_link_libraries(Foo PRIVATE FooPlugin)

この例では、Foo ターゲットは FooPlugin ライブラリをリンクしますが、INTERFACE_LINK_LIBRARIES_DIRECT プロパティとは異なり、間接的な依存関係も考慮されます。

target_link_libraries() コマンド

target_link_libraries(Foo FooPlugin)

この例は、INTERFACE_LINK_LIBRARIES_DIRECT プロパティと同じように、Foo ターゲットが FooPlugin ライブラリを直接リンクするように設定します。

カスタムターゲット

add_custom_target(FooPluginLink ALL COMMAND target_link_libraries Foo FooPlugin)

この例では、FooPluginLink という名前のカスタムターゲットを作成し、Foo ターゲットが FooPlugin ライブラリをリンクするように設定します。

どの方法を選択すべきか

どの代替方法を選択するかは、状況によって異なります。

  • より詳細な制御が必要な場合は、target_link_libraries() コマンドまたはカスタムターゲットを使用することができます。
  • 古いバージョンの CMake を使用している場合は、INTERFACE_LINK_LIBRARIES プロパティを使用する必要があります。
  • シンプルな直接リンク依存関係の場合は、INTERFACE_LINK_LIBRARIES_DIRECT プロパティが最も簡単で効率的な方法です。
  • CMake の最新バージョンを使用していることを確認してください。最新バージョンには、依存関係を管理するためのより多くの機能が含まれています。
  • カスタムターゲットは、複雑な依存関係を管理するのに役立ちますが、学習曲線が最も急な方法です。