「CMake - インクルード」の版間の差分
42行目: | 42行目: | ||
== インクルードパスの指定 == | == インクルードパスの指定 == | ||
==== target_include_directoriesコマンド (推奨) ==== | |||
インクルードパスを指定する場合、<code>target_include_directories</code>コマンドを使用する。<br> | |||
<code>target_include_directories</code>コマンドを使用することにより、ターゲット単位でインクルードパスを適切に管理できる。<br> | |||
<br> | |||
* PUBLIC | |||
*: このターゲットを使用する他のターゲットからインクルードできるパス | |||
* PRIVATE | |||
*: このターゲット内部でのみ使用するインクルードパス | |||
* $<BUILD_INTERFACE:...> | |||
*: ビルド時のインクルードパス | |||
* $<INSTALL_INTERFACE:...> | |||
*: インストール後のインクルードパス | |||
<syntaxhighlight lang="cmake"> | |||
# ターゲットの定義 | |||
add_library(my_library | |||
source1.cpp | |||
source2.cpp | |||
) | |||
# ターゲットのインクルードディレクトリを指定 | |||
target_include_directories(my_library | |||
PUBLIC | |||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> | |||
$<INSTALL_INTERFACE:include> | |||
PRIVATE | |||
${PROJECT_SOURCE_DIR}/external/lib1/include | |||
${PROJECT_SOURCE_DIR}/external/lib2/include | |||
) | |||
</syntaxhighlight> | |||
<br> | |||
==== include_directoriesコマンド (非推奨) ==== | |||
<u><code>include_directories</code>コマンドの使用は避けるべきである。</u><br> | |||
<u>これは、プロジェクト全体で共通のインクルードパスを設定するため、意図しないインクルードが発生する可能性があるからである。</u><br> | |||
<br> | |||
インクルードパスを指定する場合、<code>include_directories</code>コマンドを使用する。<br> | インクルードパスを指定する場合、<code>include_directories</code>コマンドを使用する。<br> | ||
<syntaxhighlight lang="cmake"> | <syntaxhighlight lang="cmake"> |
2024年4月4日 (木) 06:50時点における版
概要
非ターゲットのインクルード (target_include_directoriesコマンド)
find_package
コマンドは、include
コマンドで手動で行う設定を、REQUIRED
オプション等を使用して自動で行うことができる。
find_package(PkgConfig)
find_package
コマンドは、pkg_search_module
コマンドよりも柔軟でより多くのオプションが存在する。
また、CMakeには豊富なパッケージ定義が付属しており、パッケージ管理システムからインストールしたソフトウェアは/usr/share/cmake/Modules/Find*.cmakeファイルにある。
target_include_directories(<ターゲット名> PUBLIC ...)
コマンドは、
<ターゲット名>を使用する全てのターゲットにおいて、自動的にインクルードディレクトリが使用されるようになる。
ただし、CMakeLists.txtファイル内のターゲットにのみ有効であり、pkg_search_module
コマンドで取得したライブラリに対しては機能しない。
# pkg-configコマンドの使用
find_package(PkgConfig REQUIRED)
# pkg-configコマンドを使用してライブラリとヘッダファイルを自動的に設定
pkg_check_modules(<任意の変数名> <.pcファイル内の[Name]セクション名 例. sdl2> REQUIRED IMPORTED_TARGET)
# ...略
target_link_libraries(<ターゲット名>
${<任意の変数名>_LIBRARIES}
)
target_include_directories(<ターゲット名> PUBLIC
${<任意の変数名>_INCLUDE_DIRS}
)
target_compile_options(<ターゲット名> PUBLIC
${<任意の変数名>_CFLAGS}
# または
${<任意の変数名>_CFLAGS_OTHER}
)
インクルードパスの指定
target_include_directoriesコマンド (推奨)
インクルードパスを指定する場合、target_include_directories
コマンドを使用する。
target_include_directories
コマンドを使用することにより、ターゲット単位でインクルードパスを適切に管理できる。
- PUBLIC
- このターゲットを使用する他のターゲットからインクルードできるパス
- PRIVATE
- このターゲット内部でのみ使用するインクルードパス
- $<BUILD_INTERFACE:...>
- ビルド時のインクルードパス
- $<INSTALL_INTERFACE:...>
- インストール後のインクルードパス
# ターゲットの定義
add_library(my_library
source1.cpp
source2.cpp
)
# ターゲットのインクルードディレクトリを指定
target_include_directories(my_library
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
PRIVATE
${PROJECT_SOURCE_DIR}/external/lib1/include
${PROJECT_SOURCE_DIR}/external/lib2/include
)
include_directoriesコマンド (非推奨)
include_directories
コマンドの使用は避けるべきである。
これは、プロジェクト全体で共通のインクルードパスを設定するため、意図しないインクルードが発生する可能性があるからである。
インクルードパスを指定する場合、include_directories
コマンドを使用する。
include_directories(/path/to/include)
include_directories
コマンドを複数使用する場合、デフォルトでは、指定したパスは最後尾となる。
ただし、include_directories
コマンドにBEFORE
オプションを付加した場合は最前となる。
以下の例では、"-I/path1/to/include -I/path2/to/include"となる。
include_directories(/path1/to/include)
include_directories(/path2/to/include)
以下の例では、"-I/path2/to/include -I/path1/to/include" となる。
include_directories(/path1/to/include)
include_directories(BEFORE /path2/to/include)