CMake: Boost ライブラリ探しを簡単にする - CMAKE_SYSTEM_PREFIX_PATH と CMAKE_PREFIX_PATH の使い分け


この変数の役割

  • プロジェクト自体では変更しないようになっています。代わりに、CMAKE_PREFIX_PATH 変数を使用してください。
  • 環境変数に基づいて値が自動的に設定されます。
  • CMAKE_INSTALL_PREFIXCMAKE_STAGING_PREFIX で指定されたパスも含まれます。
  • システム標準のライブラリとツールへのパスを保持します。

CMAKE_SYSTEM_PREFIX_PATH の使い方

この変数は、CMake の find_package コマンドで使用されます。このコマンドは、指定されたライブラリやツールがインストールされているかどうかを確認し、必要な場合はそれらのパスを設定します。

find_package(Boost REQUIRED)

上記の例では、Boost ライブラリがインストールされているかどうか find_package コマンドがチェックします。インストールされている場合、ライブラリのヘッダーファイルとライブラリファイルへのパスが自動的に設定されます。

CMAKE_SYSTEM_PREFIX_PATH の注意点

  • プロジェクト固有のライブラリやツールへのパスを設定するには、CMAKE_PREFIX_PATH 変数を使用する必要があります。
  • これは、システム標準のライブラリとツールへのパスを保持するためです。
  • この変数は、プロジェクト自体で変更しないようになっています。
  • CMAKE_SYSTEM_PREFIX_PATH は、プロジェクト自体で変更することはできません。
  • CMAKE_PREFIX_PATH は、プロジェクト内で自由に設定できます。
  • CMAKE_SYSTEM_PREFIX_PATH は、システム標準のライブラリとツールへのパスを保持するために使用されます。
  • CMAKE_PREFIX_PATH は、プロジェクト固有のライブラリやツールへのパスを設定するために使用されます。
  • プロジェクト固有のライブラリやツールへのパスを設定するには、CMAKE_PREFIX_PATH 変数を使用する必要があります。
  • この変数は、プロジェクト自体で変更しないようになっています。
  • この変数は、find_package コマンドで使用されます。
  • CMAKE_SYSTEM_PREFIX_PATH は、CMakeがインストール済みライブラリやツールを探すパスを指定するための変数です。


cmake_minimum_required(VERSION 3.10)

project(myproject)

find_package(Boost REQUIRED)

if(NOT Boost_FOUND)
  message(FATAL_ERROR "Boost library not found")
endif()

# Boost ヘッダーファイルを使用する
add_executable(myprogram myprogram.cpp)
target_link_libraries(myprogram Boost::system)

このコードは次のようになります。

  1. CMake のバージョン 3.10 以降が必要であることを宣言します。
  2. myproject という名前のプロジェクトを作成します。
  3. Boost ライブラリを検索します。
  4. Boost ライブラリが見つからない場合は、エラーメッセージを表示して終了します。
  5. Boost ヘッダーファイルを使用するプログラム myprogram を作成します。
  6. プログラム myprogramBoost::system ライブラリとリンクします。

この例では、CMAKE_SYSTEM_PREFIX_PATH 変数は暗黙的に使用されます。これは、CMake がシステム標準のライブラリとツールへのパスを自動的に設定するためです。

CMAKE_PREFIX_PATH を明示的に設定する

プロジェクト固有のライブラリやツールへのパスを設定するには、CMAKE_PREFIX_PATH 変数を明示的に設定する必要があります。

cmake_minimum_required(VERSION 3.10)

project(myproject)

# プロジェクト固有のライブラリへのパスを設定
set(CMAKE_PREFIX_PATH "/my/custom/prefix")

find_package(MyCustomLib REQUIRED)

if(NOT MyCustomLib_FOUND)
  message(FATAL_ERROR "MyCustomLib library not found")
endif()

# MyCustomLib ヘッダーファイルを使用する
add_executable(myprogram myprogram.cpp)
target_link_libraries(myprogram MyCustomLib)
  1. CMake のバージョン 3.10 以降が必要であることを宣言します。
  2. myproject という名前のプロジェクトを作成します。
  3. /my/custom/prefix ディレクトリを CMAKE_PREFIX_PATH 変数に設定します。
  4. MyCustomLib ライブラリを検索します。
  5. MyCustomLib ライブラリが見つからない場合は、エラーメッセージを表示して終了します。
  6. MyCustomLib ヘッダーファイルを使用するプログラム myprogram を作成します。
  7. プログラム myprogramMyCustomLib ライブラリとリンクします。

この例では、CMAKE_PREFIX_PATH 変数を使用して、/my/custom/prefix ディレクトリ内の MyCustomLib ライブラリを検索します。

  • CMAKE_SYSTEM_PREFIX_PATH 変数は、プロジェクト自体で変更しないようになっています。
  • プロジェクト固有のライブラリやツールへのパスを設定するには、CMAKE_PREFIX_PATH 変数を使用する必要があります。
  • CMAKE_SYSTEM_PREFIX_PATH 変数は、CMake がシステム標準のライブラリとツールを探すパスを保持します。


  • システム標準のライブラリとツールへのパスしか保持できない
  • プロジェクト自体で変更できない

これらの制限を回避するために、CMAKE_SYSTEM_PREFIX_PATH の代替方法をいくつか紹介します。

CMAKE_PREFIX_PATH を使用する

CMAKE_PREFIX_PATH は、プロジェクト固有のライブラリやツールへのパスを設定するために使用できます。これは、CMAKE_SYSTEM_PREFIX_PATH とは異なり、プロジェクト内で自由に設定できます。

cmake_minimum_required(VERSION 3.10)

project(myproject)

# プロジェクト固有のライブラリへのパスを設定
set(CMAKE_PREFIX_PATH "/my/custom/prefix")

find_package(MyCustomLib REQUIRED)

if(NOT MyCustomLib_FOUND)
  message(FATAL_ERROR "MyCustomLib library not found")
endif()

# MyCustomLib ヘッダーファイルを使用する
add_executable(myprogram myprogram.cpp)
target_link_libraries(myprogram MyCustomLib)

環境変数を使用する

環境変数を使用して、ライブラリやツールのパスを設定することもできます。これは、CMAKE_PREFIX_PATHCMAKE_SYSTEM_PREFIX_PATH の両方の代替方法として使用できます。

setenv(MYCUSTOMLIB_DIR "/my/custom/prefix")

上記の例では、MYCUSTOMLIB_DIR という環境変数を設定しています。この変数は、CMake の find_package コマンドで使用できます。

cmake_minimum_required(VERSION 3.10)

project(myproject)

find_package(MyCustomLib REQUIRED)

if(NOT MyCustomLib_FOUND)
  message(FATAL_ERROR "MyCustomLib library not found")
endif()

# MyCustomLib ヘッダーファイルを使用する
add_executable(myprogram myprogram.cpp)
target_link_libraries(myprogram MyCustomLib)

手動でパスを設定する

find_package コマンドの CMAKE_FIND_ROOT_PATH オプションを使用して、ライブラリやツールのパスを手動で設定することもできます。

cmake_minimum_required(VERSION 3.10)

project(myproject)

find_package(MyCustomLib REQUIRED PATHS "/my/custom/prefix")

if(NOT MyCustomLib_FOUND)
  message(FATAL_ERROR "MyCustomLib library not found")
endif()

# MyCustomLib ヘッダーファイルを使用する
add_executable(myprogram myprogram.cpp)
target_link_libraries(myprogram MyCustomLib)

モジュールを使用する

ライブラリやツールのパスを設定するモジュールを使用することもできます。いくつかのよく知られたモジュールには次のようなものがあります。

これらのモジュールは、特定のライブラリやツール用に設計されています。詳細については、モジュールのドキュメントを参照してください。

CMAKE_SYSTEM_PREFIX_PATH にはいくつかの制限があります。これらの制限を回避するには、上記の代替方法を使用できます。