CMake find_libraryコマンドとfind_packageモジュールの比較

2024-04-02

CMake find_library コマンド解説

find_library() コマンドは、CMake で外部ライブラリを見つけるために使用されます。これは、プロジェクトに必要なライブラリを自動的に検出して、ビルドプロセスを簡略化するのに役立ちます。

コマンドフォーマット

find_library(<VAR> <NAME> [<PATHS>...])
  • <VAR>: 検索結果を格納する変数名
  • <NAME>: 探しているライブラリの名前
  • <PATHS>: ライブラリファイルが格納されている可能性のあるパス (オプション)

オプション

  • REQUIRED: ライブラリが見つからない場合、エラーが発生します。
  • NO_DEFAULT_PATH: システムパスを検索しません。
  • PATHS: ライブラリファイルを探すパスを指定します。
  • NAMES: 複数の名前でライブラリを検索します。

動作

find_library() コマンドは、以下の手順でライブラリを探します。

  1. <PATHS> で指定されたパスを検索します。
  2. システムパスを検索します (NO_DEFAULT_PATH オプションが指定されていない場合)。
  3. キャッシュ内の情報を確認します。

find_library(FOO foo)

# ライブラリが見つかった場合
if(FOO)
  message("ライブラリ foo が見つかりました。")
else()
  message("ライブラリ foo が見つかりませんでした。")
endif()

補足

  • find_library() コマンドは、ヘッダーファイルだけでなく、ライブラリファイル (.so.dll など) も検索します。
  • ライブラリが見つからない場合は、find_package() コマンドを使用することもできます。
  • find_library() コマンドは、複雑な設定も可能です。詳細は上記のドキュメントを参照してください。
  • CMake には、find_path()find_file() などの他の検索コマンドもあります。
  • CMake のコマンドは、大文字と小文字が区別されます。


find_library コマンドのサンプルコード

基本的なサンプル

find_library(FOO foo)

# ライブラリが見つかった場合
if(FOO)
  message("ライブラリ foo が見つかりました。")
else()
  message("ライブラリ foo が見つかりませんでした。")
endif()

パスを指定する

find_library(FOO foo /usr/local/lib)

# ライブラリが見つかった場合
if(FOO)
  message("ライブラリ foo が見つかりました。")
else()
  message("ライブラリ foo が見つかりませんでした。")
endif()

複数の名前で検索する

find_library(FOO foo bar)

# ライブラリが見つかった場合
if(FOO)
  message("ライブラリ foo または bar が見つかりました。")
else()
  message("ライブラリ foo または bar が見つかりませんでした。")
endif()

ライブラリが見つからなかった場合の処理

find_library(FOO foo REQUIRED)

# ライブラリが見つかった場合
if(FOO)
  message("ライブラリ foo が見つかりました。")
else()
  message(FATAL_ERROR "ライブラリ foo が見つかりませんでした。")
endif()

キャッシュを使用する

find_library(FOO foo)

# キャッシュにライブラリ情報がない場合
if(NOT FOO)
  # ライブラリを探す処理
  ...
  set(FOO ...)
  cache(FOO ...)
endif()

# ライブラリ情報を利用する
...

find_package コマンドを使用する

find_package(Foo REQUIRED)

# ライブラリが見つかった場合
if(Foo_FOUND)
  message("ライブラリ Foo が見つかりました。")
  # Foo_LIBRARIES などの変数を利用する
else()
  message(FATAL_ERROR "ライブラリ Foo が見つかりませんでした。")
endif()


CMakeで外部ライブラリを見つける方法

手動で設定する

target_link_libraries() コマンドを使用して、ライブラリのパスと名前を手動で設定できます。

target_link_libraries(my_target /usr/local/lib/libfoo.so)

find_package モジュールを使用する

特定のライブラリ用の find_package モジュールが用意されている場合があります。これらのモジュールは、ライブラリの検索と設定を自動化します。

find_package(Foo REQUIRED)

target_link_libraries(my_target Foo::Foo)

外部ツールを使用する

cpackconan などの外部ツールを使用して、ライブラリのインストールと設定を管理できます。

ソースコードからビルドする

必要なライブラリがソースコードとして提供されている場合は、CMake で直接ビルドすることができます。

add_subdirectory(external/foo)

target_link_libraries(my_target foo)
  • ライブラリが標準的なものであれば、find_library() コマンドを使うのが最も簡単です。
  • 特定のライブラリ用の find_package モジュールが用意されている場合は、それを利用するのがおすすめです。
  • ライブラリのインストールや設定が複雑な場合は、外部ツールを使うと便利です。
  • ライブラリのソースコードが提供されている場合は、ソースコードからビルドするのが最も柔軟な方法です。

CMakeで外部ライブラリを見つける方法はいくつかあります。状況に合わせて適切な方法を選択してください。




CMakeのCommandsにおけるuse_mangled_mesa()

use_mangled_mesa() は CMake の Commands における関数で、Mesa ライブラリの mangled シンボル名を解決するために使用されます。Mesa は OpenGL の実装であり、古いバージョンの Mesa ではシンボル名が mangled されるため、use_mangled_mesa() を使用してこれらのシンボル名を解決する必要があります。



プログラミング初心者でもわかる!CMake の "set_directory_properties()" コマンドの使い方

set_directory_properties() コマンドは、CMakeプロジェクト内のディレクトリとサブディレクトリにプロパティを設定するために使用されます。これらのプロパティは、ビルドプロセス、インストール、その他の CMake 動作を制御するために使用できます。


CMake で変数を削除する3つの方法:unset() 以外にも使えるテクニック

<variable_name> は、削除したい変数の名前です。変数の名前は、文字、数字、下線(_)で構成され、先頭に数字以外のアクティブ文字が来る必要があります。変数の削除この例では、MY_VAR という変数を作成し、"Hello, world!" という値を設定します。その後、unset() コマンドを使用して MY_VAR を削除します。2番目の message() コマンドは、MY_VAR が削除されたことを確認するために使用されます。


CMakeにおける"get_target_property()"コマンド: ターゲットの情報を自在に操る

get_target_property()コマンドは、CMakeプロジェクトで定義されたターゲットからプロパティを取得するために使用されます。ターゲットプロパティは、ターゲットのビルド方法や動作を制御するために使用される情報です。構文引数VAR: ターゲットプロパティの値を格納する変数名


CMake include() で効率的なビルドを実現

include() は CMake の重要なコマンドの一つで、他の CMake ファイルやモジュールを読み込むために使用されます。 これにより、コードを分割し、再利用性と保守性を向上させることができます。機能他の CMake ファイルを読み込んで、その中のコマンドを実行する



初めての CMake Modules: FindPkgConfig で外部ライブラリを使いこなす

この解説では、FindPkgConfig の仕組み、使用方法、オプション、および高度な使い方について詳しく説明します。FindPkgConfig は、CMake モジュールの一つであり、以下の機能を提供します。pkg-config との連携: インストール済みパッケージの情報を検索し、解析します。


CMake の Variables に関連する CMAKE_FRAMEWORK_PATH のプログラミング解説

CMake の CMAKE_FRAMEWORK_PATH 変数は、フレームワークライブラリの場所を指定するために使用されます。これは、クロスプラットフォーム開発プロジェクトで特に重要であり、異なるオペレーティングシステムで異なるフレームワークパスが必要になる場合があります。


【徹底解説】CMakeの変数 CMAKE_LANG_IMPLICIT_LINK_DIRECTORIES をマスターしよう!

概要CMAKE_LANG_IMPLICIT_LINK_DIRECTORIES は、CMake 変数の 1 つであり、特定のプログラミング言語における 暗黙的なリンカ検索パス を格納します。これは、コンパイラがライブラリを自動的に検索するために使用するディレクトリのリストです。


CMakeで.NETプロジェクトをビルドする際のVS_DOTNET_REFERENCES_COPY_LOCALプロパティの役割

VS_DOTNET_REFERENCES_COPY_LOCAL は、CMake で .NET プロジェクトをビルドする際に、参照されているアセンブリを出力ディレクトリにコピーするかどうかを制御するプロパティです。デフォルトでは ON に設定されており、参照されているアセンブリは出力ディレクトリにコピーされます。


CMakeの「Properties of Global Scope」に潜む力:AUTOUIC_SOURCE_GROUP徹底解説

"AUTOUIC_SOURCE_GROUP" は、CMake の "Properties of Global Scope" におけるプロパティであり、AUTOUIC ツールによって生成されたソースファイルのソースグループを指定するために使用されます。このプロパティは、CMake 3.21 以降で導入されました。