【保存版】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
ライブラリが公開されます。