CMakeの環境変数:LD_LIBRARY_PATH、CPATH、CMAKE_PREFIX_PATHの役割と設定方法

2024-04-02

CMakeにおけるCMAKE_PREFIX_PATH:分かりやすく解説

CMAKE_PREFIX_PATHの概要

CMAKE_PREFIX_PATHは、find_package()find_program()find_library()find_file()、**find_path()**などのコマンドが、必要なライブラリやヘッダーファイルなどを検索する際に使用するディレクトリを指定します。これは、複数のディレクトリに分散してインストールされたライブラリやヘッダーファイルを、一括して検索できるようにするためのものです。

CMAKE_PREFIX_PATHの使用方法

CMAKE_PREFIX_PATHは、以下の方法で設定できます。

  • CMakeLists.txtファイル
set(CMAKE_PREFIX_PATH "/usr/local;/opt/local")
  • 環境変数
export CMAKE_PREFIX_PATH="/usr/local;/opt/local"
  • コマンドライン
cmake -DCMAKE_PREFIX_PATH="/usr/local;/opt/local" ..

CMAKE_PREFIX_PATHの例

以下は、CMAKE_PREFIX_PATHの使用方法の例です。

# /usr/local/libにインストールされたライブラリを検索
find_library(FOO foo)

# /opt/local/includeにインストールされたヘッダーファイルを検索
find_path(BAR bar.h)

上記の例では、CMAKE_PREFIX_PATHが**"/usr/local;/opt/local"**に設定されているため、find_library()"/usr/local/lib"、**find_path()"/opt/local/include"**を検索します。

CMAKE_PREFIX_PATHの設定時の注意点

  • 複数のディレクトリを指定する場合は、セミコロンで区切ります
  • ディレクトリの末尾にはスラッシュ(/)を含めない
  • 環境変数よりもCMakeLists.txtファイルで設定した方が優先されます
  • 設定したディレクトリに、必要なライブラリやヘッダーファイルが存在することを確認する必要があります

CMAKE_PREFIX_PATHのまとめ



CMAKE_PREFIX_PATHを使用したサンプルコード

set(CMAKE_PREFIX_PATH "/usr/local;/opt/local")

find_library(FOO foo)
find_path(BAR bar.h)

環境変数を使用する

export CMAKE_PREFIX_PATH="/usr/local;/opt/local"

cmake ..

コマンドラインを使用する

cmake -DCMAKE_PREFIX_PATH="/usr/local;/opt/local" ..

特定のディレクトリを優先的に検索する

set(CMAKE_PREFIX_PATH "/opt/local; /usr/local")

find_library(FOO foo)

キャッシュをクリアする

cmake clean

複数のライブラリバージョンを管理する

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "/usr/local/lib/cmake")

find_package(Foo REQUIRED)
find_package(Bar CONFIG)

if(TARGET Foo)
  message(STATUS "Found Foo version ${Foo_VERSION}")
endif()

if(TARGET Bar)
  message(STATUS "Found Bar version ${Bar_VERSION}")
endif()

外部プロジェクトをビルドする

set(CMAKE_PREFIX_PATH "/usr/local;/opt/local")

add_subdirectory(external_project)

補足

  • 上記のサンプルコードは、Linux環境を想定しています。他の環境では、パス区切り文字などを適宜変更する必要があります。
  • CMakeには、CMAKE_FIND_ROOT_PATHCMAKE_FIND_LIBRARY_PATHCMAKE_FIND_INCLUDE_PATHなどの他の関連変数もあります。これらの変数の詳細は、CMake documentation を参照してください。


CMAKE_PREFIX_PATH以外の方法

**find_package()**コマンドには、NO_CMAKE_FIND_ROOT_PATHオプションがあります。このオプションを指定すると、CMAKE_PREFIX_PATHは無視され、**find_package()**は、デフォルトの検索パスのみを使用します。

find_package(Foo NO_CMAKE_FIND_ROOT_PATH)

find_library()、find_path()コマンドのPATHSオプション

find_library()、**find_path()**コマンドには、PATHSオプションがあります。このオプションを指定すると、find_library()、**find_path()**は、指定されたディレクトリのみを検索します。

find_library(FOO foo PATHS "/usr/local/lib")
find_path(BAR bar.h PATHS "/opt/local/include")

手動でヘッダーファイルやライブラリのパスを指定する

target_include_directories()、**target_link_libraries()**コマンドを使用して、ヘッダーファイルやライブラリのパスを手動で指定することができます。

target_include_directories(my_target PUBLIC "/usr/local/include")
target_link_libraries(my_target PUBLIC "/usr/local/lib/libfoo.so")

外部プロジェクトのビルドシステムを使用する

外部プロジェクトの場合、そのプロジェクトのビルドシステムを使用することができます。

add_subdirectory(external_project)

環境変数を使用する

LD_LIBRARY_PATHCPATHなどの環境変数を使用して、ライブラリやヘッダーファイルのパスを設定することができます。

export LD_LIBRARY_PATH="/usr/local/lib"
export CPATH="/opt/local/include"

シンボリックリンクを使用する

必要なライブラリやヘッダーファイルへのシンボリックリンクを作成することができます。

ln -s /usr/local/lib/libfoo.so /usr/lib/libfoo.so
ln -s /opt/local/include/bar.h /usr/include/bar.h

インストールパスを変更する

CMakeLists.txtファイルで、CMAKE_INSTALL_PREFIX変数を使用して、インストールパスを変更することができます。

set(CMAKE_INSTALL_PREFIX "/usr/local")

上記の方法は、CMAKE_PREFIX_PATH以外にも、必要なライブラリやヘッダーファイルを検索する方法です。状況に応じて、最適な方法を選択してください。




CMake try_compile() を使って特定のライブラリがインストールされているかどうかを確認する方法

try_compile() は、CMake の強力なコマンドの一つで、コードを実際にコンパイルすることなく、コンパイルが成功するかどうかを確認することができます。これは、特定のコンパイラやオプションがシステム上で使用可能かどうかをテストしたり、コードの移植性を検証したりする際に非常に便利です。



CMakeコマンド「ctest_submit()」でテスト結果をCDashサーバーに送信

ctest_submit()は、CMakeの「Commands」カテゴリに属するコマンドで、テスト結果をCDashなどのダッシュボードサーバーに送信するために使用されます。テスト実行後の結果を可視化、共有したい場合に役立ちます。基本構文オプション解説


CMakeのCommandsにおけるuse_mangled_mesa()

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


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

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


【初心者向け】CMakeでテストを実行する3つのステップ: ctest_test() コマンドから始める

引数:<test_name>: 実行するテストの名前。ワイルドカードを使用して、名前パターンに一致する複数のテストを選択できます。[OPTIONAL arguments]: テストの実行方法を制御するオプション引数。ctest_test()コマンドには、テストの実行方法を細かく制御するための様々なオプション引数が用意されています。以下に、よく使用されるオプション引数をいくつか紹介します。



CMakeのCommandsにおけるuse_mangled_mesa()

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


HEADER_SET_NAME プロパティ徹底解説:CMakeでヘッダーファイルを賢く管理

"HEADER_SET_NAME" は、CMakeプロジェクトにおけるターゲットプロパティの一つで、ヘッダーファイルのセットに名前を割り当てるために使用されます。これは、ヘッダーファイルのグループをまとめて扱いやすくするために役立ちます。設定方法:


CMakeのCTEST_CUSTOM_WARNING_EXCEPTION変数を使って警告メッセージを無視する方法

変数の役割CTEST_CUSTOM_WARNING_EXCEPTIONは、正規表現のリストとして設定されます。テストの実行中に、CTestは各警告メッセージをこのリストと照合します。メッセージがリスト内のいずれかの正規表現に一致した場合、その警告は出力されません。


cmake_policy()コマンドを使いこなしてCMakeプロジェクトをマスター

cmake_policy()コマンドの基本的な構文は以下の通りです。<policy-id>: ポリシーの識別子。CMP<NNNN>形式で指定されます。<behavior>: ポリシーの動作。OLDまたはNEWを指定します。OLDとNEWの動作の違い


CMAKE_NOT_USING_CONFIG_FLAGS 変数の設定方法とサンプルコード

デフォルトでは、CMake はビルドタイプに基づいてコンパイルオプションを設定します。例えば、Debug ビルドでは、デバッグ情報を生成するためのオプションが設定されます。しかし、場合によっては、これらのオプションを無効化したい場合があります。