CMake: ライブラリ検索の悩みを解決! CMAKE_LIBRARY_PATH と代替方法


CMakeの変数「CMAKE_LIBRARY_PATH」は、プロジェクトで必要なライブラリを検索するパスを指定するために使用されます。これは、find_library()コマンドで使用される主要な検索パスの1つです。

構文

set(CMAKE_LIBRARY_PATH "<path1>;<path2>;...;<pathN>")

ここで、<path1>, <path2>, ..., <pathN> はライブラリが存在するディレクトリへのパスを表します。パスはセミコロンで区切ります。

デフォルト値

デフォルトでは、CMAKE_LIBRARY_PATH は空の文字列です。つまり、CMakeはライブラリを検索しません。

設定方法

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

  • 環境変数 CMAKE_LIBRARY_PATH を設定する
  • コマンドラインオプション -DCMAKE_LIBRARY_PATH="<path>" で設定する
  • CMakeLists.txtファイル内で set() コマンドを使用して設定する

以下の例は、CMAKE_LIBRARY_PATH/usr/local/lib/opt/local/lib に設定する方法を示しています。

# CMakeLists.txt内での設定
set(CMAKE_LIBRARY_PATH "/usr/local/lib;/opt/local/lib")

# コマンドラインオプションでの設定
cmake -DCMAKE_LIBRARY_PATH="/usr/local/lib;/opt/local/lib" .

# 環境変数での設定
export CMAKE_LIBRARY_PATH="/usr/local/lib;/opt/local/lib"
cmake .
  • CMAKE_LIBRARY_PATH は、ライブラリのディレクトリのみを指定します。ライブラリの名前は、find_library() コマンドに別途指定する必要があります。
  • CMAKE_LIBRARY_PATH は、プロジェクト固有のライブラリ検索パスを指定するために使用されます。システム全体で使用されるライブラリ検索パスを設定するには、CMAKE_SYSTEM_LIBRARY_PATH を使用します。
  • CMAKE_LIBRARY_PATH は、find_library() コマンドで使用される主要な検索パスの1つです。他にも、CMAKE_SYSTEM_LIBRARY_PATHCMAKE_PREFIX_PATH などの変数も検索パスに使用できます。


# CMakeLists.txt

set(CMAKE_LIBRARY_PATH "/usr/local/lib;/opt/local/lib")

find_library(LIBFOO foo)

if(LIBFOO)
    target_link_libraries(mytarget LIBFOO)
endif()

例2:システム全体で使用されるライブラリ検索パスを設定する

この例では、CMAKE_SYSTEM_LIBRARY_PATH/usr/lib に設定し、システム全体で使用されるライブラリ検索パスを変更します。

# CMakeLists.txt

set(CMAKE_SYSTEM_LIBRARY_PATH "/usr/lib")

例3:環境変数を使用してライブラリ検索パスを設定する

この例では、環境変数 CMAKE_LIBRARY_PATH/usr/local/lib に設定し、ライブラリ検索パスを変更します。

# シェルスクリプト

export CMAKE_LIBRARY_PATH="/usr/local/lib"

cmake .
  • 上記の例はあくまで一例であり、実際の状況に合わせて変更する必要があります。


CMakeの変数「CMAKE_LIBRARY_PATH」は、プロジェクトで必要なライブラリを検索するパスを指定するために使用されます。しかし、状況によっては、CMAKE_LIBRARY_PATH を使用せずにライブラリを検索する方法が必要になる場合があります。

代替方法

以下に、CMAKE_LIBRARY_PATH の代替方法をいくつか紹介します。

find_package() コマンドを使用する

find_package() コマンドは、特定のライブラリパッケージを検索し、必要なライブラリとヘッダーファイルへのパスを設定します。CMAKE_LIBRARY_PATH を設定する必要はありません。

find_package(FooBar REQUIRED)

target_link_libraries() コマンドにライブラリのフルパスを指定する

target_link_libraries() コマンドにライブラリのフルパスを指定することで、ライブラリをリンクできます。CMAKE_LIBRARY_PATH を設定する必要はありません。

target_link_libraries(mytarget /usr/local/lib/libfoo.a)

pkg_config モジュールを使用する

pkg_config モジュールは、システムにインストールされているライブラリパッケージの情報を読み取り、必要なライブラリとヘッダーファイルへのパスを設定します。CMAKE_LIBRARY_PATH を設定する必要はありません。

find_package(PkgConfig REQUIRED)
pkg_check_modules(FooBar REQUIRED libfoo)
target_link_libraries(mytarget FooBar::LIBRARIES)

手動でライブラリとヘッダーファイルを指定する

include_directories() コマンドと target_link_libraries() コマンドを使用して、ライブラリとヘッダーファイルへのパスを手動で指定できます。CMAKE_LIBRARY_PATH を設定する必要はありません。

include_directories(/usr/local/include)
target_link_libraries(mytarget /usr/local/lib/libfoo.a)

それぞれの方法の利点と欠点

方法利点欠点
find_package()ライブラリパッケージのバージョン管理と依存関係を自動的に処理できる特定のライブラリパッケージのみ対応
target_link_libraries()ライブラリのフルパスが分かっている場合に簡単ライブラリのフルパスを常に把握する必要がある
pkg_configシステムにインストールされているライブラリパッケージのみ対応可能pkg_config モジュールがインストールされている必要がある
手動で指定柔軟性が高いライブラリとヘッダーファイルのパスを常に把握する必要がある

状況に合った方法を選択

上記の代替方法のうち、状況に合った方法を選択してください。

  • 柔軟性の高い方法が必要な場合は、手動でライブラリとヘッダーファイルを指定する方法を使用します。
  • システムにインストールされているライブラリパッケージのみを使用する場合は、pkg_config モジュールを使用するのが便利です。
  • ライブラリのフルパスが分かっている場合は、target_link_libraries() コマンドを使用するのが簡単です。
  • ライブラリパッケージが既知の場合は、find_package() コマンドを使用するのが最も簡単です。
  • それぞれの方法の詳細については、CMakeドキュメントを参照してください。
  • 上記の代替方法は、あくまでも一例であり、状況に合わせて変更する必要があります。