find_package
概要
CMakeのfind_package()
は、ライブラリやパッケージの検索を行い、その検索結果を利用してプロジェクトのビルド設定を行うための関数。find_package()
は、指定されたライブラリやパッケージがシステムにインストールされているかどうかを確認し、検出した場合は必要な情報を設定ファイルから読み込む。
通常、find_package()
は以下のような形式で使用される
find_package(<パッケージ名> <バージョン> [REQUIRED] [COMPONENTS <コンポーネント1> <コンポーネント2> ...])
<パッケージ名>
には、検索するライブラリやパッケージの名前を指定する。<バージョン>
には、使用したいバージョン番号を指定する。REQUIRED
を指定すると、必須であることを示す。COMPONENTS
には、検索するコンポーネントの名前を指定する。- 必要に応じて、他のオプションを指定することもできる。
find_package()
は、パッケージの設定ファイル(例えば、<パッケージ名>Config.cmake
、<パッケージ名>-config.cmake
、<パッケージ名>-config-version.cmake
など)を検索し、それらから必要な情報を読み取る- 設定ファイルには、パッケージが提供するインクルードファイルやライブラリの場所、コンパイルオプションなどが含まれている。
find_package()
によって検出された情報は、include_directories()
、target_include_directories()
、target_link_libraries()
などのCMakeコマンドで使用される。find_package()
を使用することで、CMakeはシステムにインストールされたライブラリやパッケージを簡単に検出し、ビルドプロセスを自動化することができる。
疑問と調べた結果
1: CMake側が勝手にパッケージを探してくれる理解で良いか?
- Yes。CMakeは一般的にパッケージを自動的に探索し、検出することができる。
- パッケージの場所や構成は、各パッケージに応じて異なるが、多くのパッケージは、CMakeが検索できる標準的な場所にインストールされている。
- たとえば、Linuxでは、多くのパッケージは/usr/libや/usr/local/libにインストールされている
2: BoostとかOpenCVとかのパッケージはライブラリ開発側が用意してくれているの?
- 少なくともOpenCVはYes。
find_package()
関数によるOpenCVの検出では、OpenCVConfig.cmake
という名前のCMakeモジュールが使用される。- このモジュールには、OpenCVのインストール場所や、使用するOpenCVのバージョン、コンポーネントなどが含まれている。
- Linuxの場合、OpenCVをapt-getなどのパッケージマネージャーでインストールした場合、OpenCVConfig.cmakeは通常、
/usr/lib/x86_64-linux-gnu/cmake/opencv4
のようなディレクトリにインストールされる。
add_difinitions
概要
- CMakeの
add_definitions()
関数は、コンパイラに対してコンパイルオプションを渡すことができる。 - 通常、この関数はプロジェクトの定義済みマクロを設定するために使用される。
add_definitions()
関数には、以下のように定義済みマクロを設定することができる。
add_definitions(-DDEFINE_NAME=DEFINE_VALUE)
- 上記の例では、
DEFINE_NAME
という名前のマクロにDEFINE_VALUE
という値を設定している。 - また、
add_definitions()
関数は、複数のオプションを指定することもできる。 - 例えば、以下のように複数の定義済みマクロを設定することができる。
add_definitions(-DDEFINE_NAME1 -DDEFINE_NAME2=DEFINE_VALUE2)
- 上記の例では、
DEFINE_NAME1
という名前のマクロを定義し、DEFINE_NAME2
という名前のマクロにDEFINE_VALUE2
という値を設定している。 add_definitions()
関数は、target_compile_definitions()
関数を使用することで、特定のターゲットに対して定義済みマクロを設定することもできる。- この方法を使用すると、ターゲットごとに異なるマクロを設定することができる。