【保存版】CMake: LINK_INTERFACE_LIBRARIES_CONFIG でできることまとめ - ターゲットライブラリのインターフェース設定を完全網羅


"LINK_INTERFACE_LIBRARIES_CONFIG" プロパティは、CMake の "Properties: Targets" において、ターゲットライブラリのインターフェースライブラリの設定に使用されます。このプロパティは、ターゲットが他のターゲットとリンクされる際に、そのインターフェースに公開されるライブラリを指定します。

構文

set_target_properties(target_name PROPERTIES LINK_INTERFACE_LIBRARIES_CONFIG library_name1 library_name2 ...)

引数

  • library_name: ターゲットがリンクされる際にインターフェースに公開されるライブラリの名前
  • target_name: 設定対象のターゲットの名前

動作

"LINK_INTERFACE_LIBRARIES_CONFIG" プロパティで指定されたライブラリは、ターゲットがリンクされる際にそのインターフェースに公開されます。これは、他のターゲットがこのターゲットとリンクする場合、そのターゲットも指定されたライブラリを使用できることを意味します。

set(target_name my_target)
set(library_name1 foo)
set(library_name2 bar)

set_target_properties(my_target PROPERTIES LINK_INTERFACE_LIBRARIES_CONFIG ${library_name1} ${library_name2})

上記の例では、my_target ターゲットが foo ライブラリと bar ライブラリとリンクされる際に、そのインターフェースに公開されます。つまり、他のターゲットがこのターゲットとリンクする場合、そのターゲットも foo ライブラリと bar ライブラリを使用できるようになります。

  • "LINK_INTERFACE_LIBRARIES_CONFIG" プロパティは、静的ライブラリと共有ライブラリの両方に使用できます。
  • "LINK_INTERFACE_LIBRARIES_CONFIG" プロパティは、ターゲットのインターフェースに公開されるライブラリのみを指定します。ターゲットが実際に使用するライブラリは、"LINK_LIBRARIES" プロパティで指定する必要があります。

メリット

"LINK_INTERFACE_LIBRARIES_CONFIG" プロパティを使用する利点は次のとおりです。

  • コードの再利用性を向上させることができます。
  • ターゲット間のライブラリの依存関係を管理しやすくなります。
  • ターゲットが他のターゲットとリンクされる際に、そのインターフェースに公開されるライブラリを明確に定義できます。
  • プロジェクトが大きくなると、管理が難しくなる可能性があります。
  • 誤った設定を行うと、ターゲット間のライブラリの依存関係が複雑になり、問題が発生する可能性があります。


cmake_minimum_required(VERSION 3.0)

project(my_project)

add_library(foo STATIC foo.c)
add_library(bar STATIC bar.c)
add_library(my_target STATIC my_target.c)

target_link_libraries(my_target foo bar)

set_target_properties(my_target PROPERTIES LINK_INTERFACE_LIBRARIES_CONFIG foo bar)

この例では、my_target ターゲットが foo ライブラリと bar ライブラリとリンクされます。また、my_target ターゲットのインターフェースに foo ライブラリと bar ライブラリが公開されます。

例 2: 複数構成

cmake_minimum_required(VERSION 3.0)

project(my_project)

add_library(foo STATIC foo.c)
add_library(bar STATIC bar.c)
add_library(my_target STATIC my_target.c)

target_link_libraries(my_target foo bar)

set_target_properties(my_target PROPERTIES LINK_INTERFACE_LIBRARIES_CONFIG_DEBUG foo)
set_target_properties(my_target PROPERTIES LINK_INTERFACE_LIBRARIES_CONFIG_RELEASE bar)

この例では、my_target ターゲットが foo ライブラリと bar ライブラリとリンクされます。DEBUG 構成では、my_target ターゲットのインターフェースに foo ライブラリのみが公開されます。一方、RELEASE 構成では、my_target ターゲットのインターフェースに bar ライブラリのみが公開されます。

説明

上記の例では、以下の点に注意してください。

  • LINK_INTERFACE_LIBRARIES_CONFIG_<CONFIG> プロパティは、特定の構成におけるターゲットのインターフェースに公開されるライブラリを指定します。
  • LINK_INTERFACE_LIBRARIES_CONFIG プロパティは、ターゲットのインターフェースに公開されるライブラリを指定します。
  • set_target_properties コマンドを使用して、ターゲットのプロパティを設定します。
  • target_link_libraries コマンドを使用して、ターゲットが使用するライブラリを指定します。
  • add_library コマンドを使用して、ライブラリを作成します。

これらのコマンドとプロパティを組み合わせることで、ターゲット間のライブラリの依存関係を詳細に制御することができます。



"TARGET_LINK_LIBRARIES" プロパティ

"TARGET_LINK_LIBRARIES" プロパティは、ターゲットが実際に使用するライブラリを指定します。このプロパティで指定されたライブラリは、ターゲットのインターフェースにも公開されます。

set(target_name my_target)
set(library_name1 foo)
set(library_name2 bar)

target_link_libraries(my_target ${library_name1} ${library_name2})

"INTERFACE_LINK_LIBRARIES" プロパティ

"INTERFACE_LINK_LIBRARIES" プロパティは、ターゲットのインターフェースに公開されるライブラリを指定します。ただし、このプロパティで指定されたライブラリは、ターゲットが実際に使用するライブラリではないことに注意が必要です。

set(target_name my_target)
set(library_name1 foo)
set(library_name2 bar)

target_link_libraries(my_target foo bar)
target_properties(my_target PROPERTIES INTERFACE_LINK_LIBRARIES ${library_name1} ${library_name2})

"PUBLIC_INTERFACE_LIBRARIES" プロパティ

"PUBLIC_INTERFACE_LIBRARIES" プロパティは、ターゲットのインターフェースに公開されるライブラリを指定します。このプロパティは、CMake のバージョン 3.15 以降で使用できます。

set(target_name my_target)
set(library_name1 foo)
set(library_name2 bar)

target_link_libraries(my_target foo bar)
target_properties(my_target PROPERTIES PUBLIC_INTERFACE_LIBRARIES ${library_name1} ${library_name2})

"IMPORTED_TARGET_PROPERTIES" コマンド

"IMPORTED_TARGET_PROPERTIES" コマンドは、インポートされたターゲットのプロパティを設定するために使用できます。このコマンドを使用して、インポートされたターゲットのインターフェースに公開されるライブラリを指定することができます。

set(imported_target_name foo_imported)
set(library_name1 bar)

add_executable(my_executable my_executable.c)
target_link_libraries(my_executable ${imported_target_name})

set_property(TARGET ${imported_target_name} PROPERTY INTERFACE_LINK_LIBRARIES ${library_name1})

上記の例では、foo_imported ターゲットがインポートされ、my_executable ターゲットとリンクされます。また、foo_imported ターゲットのインターフェースに bar ライブラリが公開されます。