「CMake - pkg-config」の版間の差分
|  (→概要) | |||
| 88行目: | 88行目: | ||
| <br> | <br> | ||
| <u>また、他の場所にライブラリをインストールしている場合は、CMakeキャッシュ変数<code><パッケージ名>_DIR</code>にライブラリのパスを設定することにより、Configファイルを見つけることができる。</u><br> | <u>また、他の場所にライブラリをインストールしている場合は、CMakeキャッシュ変数<code><パッケージ名>_DIR</code>にライブラリのパスを設定することにより、Configファイルを見つけることができる。</u><br> | ||
| <br><br> | |||
| == find_packageコマンド == | |||
| ==== find_packageコマンドとは ==== | |||
| <code>find_package</code>コマンドは、外部パッケージの設定を検索して、それをプロジェクトに取り込むために使用する。<br> | |||
| 一般的に、ライブラリのヘッダファイルやリンクするためのライブラリファイルの位置を特定する。<br> | |||
| <br> | |||
| このコマンドは、CMakeモジュールやパッケージ構成ファイルを利用して動作する。<br> | |||
| <br> | |||
| ==== 基本構文 ==== | |||
|  <syntaxhighlight lang="cmake"> | |||
|  find_package(<パッケージ名> <バージョン (省略可能)> REQUIRED <コンポーネント名 (省略可能)>) | |||
|  </syntaxhighlight> | |||
| <br> | |||
| * パッケージ名 | |||
| *: 検索するパッケージの名前 | |||
| * バージョン | |||
| *: 必要なパッケージのバージョン (省略可能) | |||
| * REQUIRED | |||
| *: パッケージが見つからない場合にエラーを発生させる。 | |||
| * コンポーネント名 | |||
| *: 特定のコンポーネント名を指定する。 (省略可能) | |||
| <br> | |||
| ==== 使用例 ==== | |||
| 以下の例では、<code>find_package</code>コマンドを使用して、OpenCVライブラリを検索している。<br> | |||
| この例では、OpenCVが見つからない場合は、CMakeはエラーを発生させる。<br> | |||
|  <syntaxhighlight lang="cmake"> | |||
|  find_package(OpenCV REQUIRED) | |||
|  </syntaxhighlight> | |||
| <br> | |||
| ==== バージョンの指定 ==== | |||
| 特定のバージョンのパッケージが必要な場合、バージョンを指定することができる。<br> | |||
| 以下の例では、バージョン 4.5以上のOpenCVが必要である。<br> | |||
|  <syntaxhighlight lang="cmake"> | |||
|  find_package(OpenCV 4.5 REQUIRED) | |||
|  </syntaxhighlight> | |||
| <br> | |||
| ==== コンポーネントの指定 ==== | |||
| パッケージが複数のコンポーネントを提供している場合、必要なコンポーネントを指定することができる。<br> | |||
| 以下の例では、OpenCVのcoreとimgprocコンポーネントを必要とする。<br> | |||
|  <syntaxhighlight lang="cmake"> | |||
|  find_package(OpenCV REQUIRED core imgproc) | |||
|  </syntaxhighlight> | |||
| <br> | |||
| ==== 検出結果の使用 ==== | |||
| <code>find_package</code>コマンドが成功した場合は、一般的に、CMake変数が設定される。<br> | |||
| 例えば、OpenCVの場合、CMake変数OpenCV_INCLUDE_DIRSやOpenCV_LIBS等の変数が設定される。<br> | |||
| <br> | |||
| * OpenCV_INCLUDE_DIRS | |||
| *: OpenCVのヘッダファイルのディレクトリ | |||
| * OpenCV_LIBS | |||
| *: OpenCVのリンクするライブラリ | |||
|  <syntaxhighlight lang="cmake"> | |||
|  target_include_directories(<ターゲット名> | |||
|     PRIVATE | |||
|        ${OpenCV_INCLUDE_DIRS} | |||
|  ) | |||
|  target_link_libraries(<ターゲット名> | |||
|     PRIVATE | |||
|        ${OpenCV_LIBS} | |||
|  ) | |||
|  </syntaxhighlight> | |||
| <br><br> | <br><br> | ||
2024年7月6日 (土) 14:25時点における版
概要
find_packageコマンドは、特定の名前のCMakeスクリプトを検索して、該当のスクリプトを実行するコマンドである。
対象となるCMakeスクリプトは、その役割に応じて、ModuleとConfigの2種類に分類される。
find_packageコマンドは、Module --> Configの順で検索を行う。
具体的な動作は以下の通りである。
- Module
 <パッケージ名>.cmakeファイル、または、Find<パッケージ名>.cmakeファイルを検索する。- CMakeキャッシュ変数である変数CMAKE_MODULE_PATHで指定されたパス
- CMakeにデフォルトで付いてくるモジュールの配置ディレクトリ (/usr/local/share/cmake/Modulesディレクトリ等)
 
- CMakeキャッシュ変数である変数
- Config
 <パッケージ名>Config.cmakeファイル、または、<パッケージ名(小文字)>-config.cmakeファイルを検索する。- CMake変数<パッケージ名>_DIRで指定されたパス
- CMakeキャッシュ変数である変数<パッケージ名>_ROOTで指定されたパス
- 環境変数<パッケージ名>_ROOTで指定されたパス
- CMakeキャッシュ変数である変数CMAKE_PREFIX_PATH、変数CMAKE_FRAMEWORK_PATH、変数CMAKE_APPBUNDLE_PATHで指定されたパス
- 環境変数<パッケージ名>_DIR、環境変数CMAKE_PREFIX_PATH、環境変数CMAKE_FRAMEWORK_PATH、環境変数CMAKE_APPBUNDLE_PATHで指定されたパス
- 環境変数PATHで指定されたパス (binディレクトリおよびsbinディレクトリで終わるディレクトリの場合は、その親ディレクトリに読み替える)
- その他
 
- CMake変数
なお、コマンド終了時において、CMake変数<パッケージ名>_FOUNDに0または1(FALSEまたはTRUE)が格納されるため、
正常に検索できたかどうかを条件分岐として記述することもできる。
Module (CMakeスクリプト)
Moduleは、以下の2種類に分類される。
- Utility Modules
- よく使用するCMake関数をまとめたもの。
- 例えば、CheckLanguage.cmake(あるプログラミング言語の開発ツールがインストールされているか確認するための機能をまとめたもの)等がある。
- Utility ModulesのCMakeスクリプトを読み込む時、check_languageコマンド、get_bundle_main_executableコマンド等の関数が定義されるため、
- それらを呼び出すことで機能を使用することができる。
 
- Find Modules
- 外部ライブラリの情報を収集するものであり、ファイル名はFind<パッケージ名>.cmakeファイルである。
- 例えば、C++で記述された外部ライブラリをリンクする場合、ヘッダファイルのディレクトリ、ライブラリファイルのディレクトリ、ライブラリファイル名の3つの情報が必要になる。
- これらの情報を自動的に収集するものがFind Modulesである。
- CMakeでは、Boost、BLAS、GLEW、OpenGL、X11、Qt4等のライブラリのFind Modulesがデフォルトで用意されている。
- ほとんどのFind Modulesは、以下に示すようなCMake変数に値が自動的に代入される。
- 変数<パッケージ名>_INCLUDE_DIRS- インクルードディレクトリのパス
 
- 変数<パッケージ名>_LIBRARY_DIRS- ライブラリファイルがあるディレクトリのパス
 
- 変数<パッケージ名>_LIBRARIES- ライブラリファイル名のリスト
 
- 変数<パッケージ名>_DEFINITIONS- コンパイル時のdefinitionフラグ
 
- コンパイル時の
 
- 変数
- find_packageコマンドを使用することにより、上記の変数は自動的に代入されるため、その変数を- target_include_directoriesコマンド等に設定を記述する。
- ただし、上記の変数名は必ずしもこの通りになっているわけではないため、ライブラリの情報を変数にまとめるのではなくターゲット(ライブラリ)を作成してそのプロパティにまとめる場合もある。
- そのため、各ライブラリのFind Modulesを確認することが必要である。
 
CMakeでは、初期状態でいくつかのModuleがインストールされている。
Moduleの一覧は、CMakeの公式Webサイトから確認することができる。
また、Moduleが存在しないライブラリでは、開発者がModuleを作成することもできる。
Config (CMakeスクリプト)
Configファイルは、CMakeプロジェクトをビルドしてライブラリをインストールした時に生成される設定ファイルである。
ファイル名は、<パッケージ名>Config.cmakeファイル、または、<パッケージ名(小文字)>-config.cmakeファイルである。
ライブラリ情報を提供する点ではFindモジュールと同様であるが、Configファイルはライブラリの開発元が直接提供している設定ファイルである。
ライブラリをインストールした時、cmakeディレクトリやshareディレクトリの中に含まれていることが多い。
Findモジュールと同様、多くのConfigファイルは以下に示すようなCMake変数が存在する。
また、これらの情報を1つのターゲットにまとめている場合もある。
- 変数<パッケージ名>_INCLUDE_DIRS- インクルードディレクトリのパス
 
- 変数<パッケージ名>_LIBRARY_DIRS- ライブラリファイルがあるディレクトリのパス
 
- 変数<パッケージ名>_LIBRARIES- ライブラリファイル名のリスト
 
- 変数<パッケージ名>_DEFINITIONS- コンパイル時のdefinitionフラグ
 
- コンパイル時の
Configファイルを使用する場合、開発元が公開しているドキュメントやConfigファイルの内容から、各変数名や各ターゲット名を確認する必要がある。
Linuxにおいて、Configファイルの場所は以下に示すようなディレクトリに配置される。
また、初期設定より、/usr/binディレクトリは環境変数PATHに設定されているため、CMakeは自動的にConfigファイルを見つけることができる。
- /usr/lib64/cmake/<パッケージ名>
- /usr/share/cmake/<パッケージ名>
したがって、Linuxでは、パッケージ管理システムからインストールしたライブラリは、find_packageコマンドで見つけることができる。
もし、ライブラリにConfigファイルが付属していない場合、開発者自身でFindモジュールを作成する必要がある。
また、他の場所にライブラリをインストールしている場合は、CMakeキャッシュ変数<パッケージ名>_DIRにライブラリのパスを設定することにより、Configファイルを見つけることができる。
find_packageコマンド
find_packageコマンドとは
find_packageコマンドは、外部パッケージの設定を検索して、それをプロジェクトに取り込むために使用する。
一般的に、ライブラリのヘッダファイルやリンクするためのライブラリファイルの位置を特定する。
このコマンドは、CMakeモジュールやパッケージ構成ファイルを利用して動作する。
基本構文
 find_package(<パッケージ名> <バージョン (省略可能)> REQUIRED <コンポーネント名 (省略可能)>)
- パッケージ名
- 検索するパッケージの名前
 
- バージョン
- 必要なパッケージのバージョン (省略可能)
 
- REQUIRED
- パッケージが見つからない場合にエラーを発生させる。
 
- コンポーネント名
- 特定のコンポーネント名を指定する。 (省略可能)
 
使用例
以下の例では、find_packageコマンドを使用して、OpenCVライブラリを検索している。
この例では、OpenCVが見つからない場合は、CMakeはエラーを発生させる。
 find_package(OpenCV REQUIRED)
バージョンの指定
特定のバージョンのパッケージが必要な場合、バージョンを指定することができる。
以下の例では、バージョン 4.5以上のOpenCVが必要である。
 find_package(OpenCV 4.5 REQUIRED)
コンポーネントの指定
パッケージが複数のコンポーネントを提供している場合、必要なコンポーネントを指定することができる。
以下の例では、OpenCVのcoreとimgprocコンポーネントを必要とする。
 find_package(OpenCV REQUIRED core imgproc)
検出結果の使用
find_packageコマンドが成功した場合は、一般的に、CMake変数が設定される。
例えば、OpenCVの場合、CMake変数OpenCV_INCLUDE_DIRSやOpenCV_LIBS等の変数が設定される。
- OpenCV_INCLUDE_DIRS
- OpenCVのヘッダファイルのディレクトリ
 
- OpenCV_LIBS
- OpenCVのリンクするライブラリ
 
 target_include_directories(<ターゲット名>
    PRIVATE
       ${OpenCV_INCLUDE_DIRS}
 )
 
 target_link_libraries(<ターゲット名>
    PRIVATE
       ${OpenCV_LIBS}
 )