CMake: ビルド RPATH の相対パス設定のすべて - CMAKE_BUILD_RPATH_USE_ORIGIN と代替方法を徹底比較


CMAKE_BUILD_RPATH_USE_ORIGIN は、CMake 3.14 以降で導入された変数です。この変数は、ビルド RPATH において相対パスを使用するかどうかを制御します。RPATH は、実行可能ファイルや共有ライブラリが共有ライブラリを見つける場所を指定するランタイムパスです。

利点

CMAKE_BUILD_RPATH_USE_ORIGINTRUE に設定すると、ビルド RPATH において相対パスが使用されます。これは、以下の利点があります。

  • 依存関係を単純化する: インストール時に RPATH を明示的に設定する必要がなくなります。
  • 移植性を向上させる: インストールされたライブラリの場所が変更されても、実行可能ファイルや共有ライブラリはそれらを適切にロードできます。

設定方法

CMAKE_BUILD_RPATH_USE_ORIGIN は、CMake のコマンドラインオプションまたは CMakeLists.txt ファイルで設定できます。

コマンドラインオプション

cmake -DCMAKE_BUILD_RPATH_USE_ORIGIN=TRUE ...

CMakeLists.txt ファイル

set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)

注意点

  • CMAKE_BUILD_RPATH_USE_ORIGIN を使用すると、実行可能ファイルや共有ライブラリが同じビルツリー内の他のライブラリに依存している場合にのみ機能します。
  • CMAKE_BUILD_RPATH_USE_ORIGIN は、すべてのプラットフォームでサポートされているわけではありません。詳細は、CMake のドキュメントを参照してください。

以下の例では、CMAKE_BUILD_RPATH_USE_ORIGINTRUE に設定し、mytarget という名前のターゲットに対してビルド RPATH を設定します。

set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)

add_executable(mytarget mytarget.cpp)

set_target_properties(mytarget PROPERTIES INSTALL_RPATH "$ORIGIN")

この例では、mytarget は同じビルツリー内の他のライブラリに依存している場合にのみ、それらを適切にロードできます。

  • BUILD_RPATH_USE_ORIGIN ターゲットプロパティは、個々のターゲットに対してビルド RPATH において相対パスを使用するかどうかを制御するために使用できます。
  • CMAKE_BUILD_RPATH_USE_ORIGIN は、BUILD_RPATH_USE_ORIGIN ターゲットプロパティを初期化するために使用されます。
  • CMake のコマンドラインオプションと CMakeLists.txt ファイルを使用して、CMake を構成できます。詳細は、CMake のドキュメントを参照してください。
  • CMake の変数には、さまざまな種類があります。詳細は、CMake のドキュメントを参照してください。


# CMakeLists.txt

cmake_minimum_required(VERSION 3.14)

project(myproject)

set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)

add_executable(mytarget mytarget.cpp)

target_link_libraries(mytarget otherlib)

set_target_properties(mytarget PROPERTIES INSTALL_RPATH "$ORIGIN")

このコードは、以下のことを行います。

  1. CMake のバージョンが 3.14 以降であることを確認します。
  2. myproject という名前のプロジェクトを作成します。
  3. CMAKE_BUILD_RPATH_USE_ORIGINTRUE に設定します。
  4. mytarget という名前の実行可能ファイルを作成します。
  5. mytargetotherlib ライブラリにリンクします。
  6. mytarget のインストール RPATH を $ORIGIN に設定します。

この例では、mytarget は同じビルツリー内の otherlib ライブラリに依存しています。CMAKE_BUILD_RPATH_USE_ORIGINTRUE に設定することで、mytargetotherlib を適切にロードできます。

  • set_target_properties コマンドは、ターゲットプロパティを設定します。
  • target_link_libraries コマンドは、ターゲットをライブラリにリンクします。
  • add_executable コマンドは、実行可能ファイルを作成します。
  • set コマンドは、CMake 変数を設定します。
  • project コマンドは、CMake プロジェクトを作成します。
  • cmake_minimum_required コマンドは、CMake の最小バージョン要件を指定します。
  • コードをコンパイルするには、以下のコマンドを実行します。
  • このコードは、Linux または macOS でコンパイルできます。
cmake .
make
  • コンパイルされた実行可能ファイルは、mytarget という名前で build ディレクトリにあります。


インストール RPATH を使用する

CMAKE_INSTALL_RPATH 変数を使用して、インストール RPATH にパスを設定できます。インストール RPATH は、実行可能ファイルや共有ライブラリがインストールされたときに設定されるランタイムパスです。

set(CMAKE_INSTALL_RPATH "$ORIGIN")

この例では、実行可能ファイルや共有ライブラリは、インストールされた場所に相対的なパスを使用して共有ライブラリを見つけることができます。

ランタイム検索パスを使用する

CMAKE_RUNTIME_SEARCH_DIRECTORY 変数を使用して、ランタイム検索パスにディレクトリを追加できます。ランタイム検索パスは、実行可能ファイルや共有ライブラリが共有ライブラリを探す場所を指定するランタイムパスです。

list(APPEND CMAKE_RUNTIME_SEARCH_DIRECTORY "${CMAKE_SOURCE_DIR}/lib")

この例では、実行可能ファイルや共有ライブラリは、lib ディレクトリ内の共有ライブラリを探すことができます。

pkg-config を使用する

pkg-config は、Unix システムで使用されるライブラリ管理ツールです。pkg-config を使用して、ライブラリのパスと依存関係を指定できます。

find_package(PkgConfig REQUIRED)
pkg_check_modules(MYTARGET REQUIRED otherlib)

target_link_libraries(mytarget MYTARGET_LIBRARIES)

この例では、mytargetotherlib ライブラリにリンクされます。pkg-config は、otherlib ライブラリのパスと依存関係を自動的に検出します。

手動で RPATH を設定する

install(TARGETS mytarget RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" RPATH ".")

この例では、mytargetbin ディレクトリにインストールされ、RPATH は . に設定されます。

最適な方法の選択

使用する方法は、プロジェクトの要件によって異なります。

  • 上記の方法がすべて当てはまらない場合は、手動で RPATH を設定する: これは、最も柔軟な方法ですが、最も複雑でもあります。
  • Unix システムを使用している場合は、pkg-config を使用する: これは、ライブラリのパスと依存関係を自動的に検出するためです。
  • ランタイム時にライブラリを見つける必要がある場合は、CMAKE_RUNTIME_SEARCH_DIRECTORY を使用する: これは、実行可能ファイルや共有ライブラリがランタイム時に共有ライブラリを探す場所を指定するためです。
  • インストールされたライブラリに依存する場合は、CMAKE_INSTALL_RPATH を使用する: これは、実行可能ファイルや共有ライブラリがインストールされたときに RPATH が設定されるためです。
  • 移植性を重視する場合は、CMAKE_BUILD_RPATH_USE_ORIGIN を使用する: これは、実行可能ファイルや共有ライブラリが同じビルツリー内の他のライブラリに依存している場合にのみ機能します。