CMakeのfind_package()とadd_difinitions()について

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()関数を使用することで、特定のターゲットに対して定義済みマクロを設定することもできる。
  • この方法を使用すると、ターゲットごとに異なるマクロを設定することができる。

疑問と調べた結果

add_definitionsではオプションの頭にDをつける必要があるの?

  • Yes。add_definitions()関数で定義済みマクロを設定する場合、-Dオプションを使用してマクロ名と値を指定する必要がある。
  • -Dオプションを使用することで、CMakeはコンパイラに対して、定義済みマクロを設定するためのオプションを渡す。
  • オプションの先頭にDをつけることにより、CMakeがマクロ名と値を認識し、正しくコンパイラに渡されるようになる。