CMake: ビルド RPATH の相対パス設定のすべて - CMAKE_BUILD_RPATH_USE_ORIGIN と代替方法を徹底比較
CMAKE_BUILD_RPATH_USE_ORIGIN
は、CMake 3.14 以降で導入された変数です。この変数は、ビルド RPATH において相対パスを使用するかどうかを制御します。RPATH は、実行可能ファイルや共有ライブラリが共有ライブラリを見つける場所を指定するランタイムパスです。
利点
CMAKE_BUILD_RPATH_USE_ORIGIN
を TRUE
に設定すると、ビルド 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_ORIGIN
を TRUE
に設定し、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")
このコードは、以下のことを行います。
- CMake のバージョンが 3.14 以降であることを確認します。
myproject
という名前のプロジェクトを作成します。CMAKE_BUILD_RPATH_USE_ORIGIN
をTRUE
に設定します。mytarget
という名前の実行可能ファイルを作成します。mytarget
をotherlib
ライブラリにリンクします。mytarget
のインストール RPATH を$ORIGIN
に設定します。
この例では、mytarget
は同じビルツリー内の otherlib
ライブラリに依存しています。CMAKE_BUILD_RPATH_USE_ORIGIN
を TRUE
に設定することで、mytarget
は otherlib
を適切にロードできます。
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)
この例では、mytarget
は otherlib
ライブラリにリンクされます。pkg-config
は、otherlib
ライブラリのパスと依存関係を自動的に検出します。
手動で RPATH を設定する
install(TARGETS mytarget RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" RPATH ".")
この例では、mytarget
は bin
ディレクトリにインストールされ、RPATH は .
に設定されます。
最適な方法の選択
使用する方法は、プロジェクトの要件によって異なります。
- 上記の方法がすべて当てはまらない場合は、手動で RPATH を設定する: これは、最も柔軟な方法ですが、最も複雑でもあります。
- Unix システムを使用している場合は、
pkg-config
を使用する: これは、ライブラリのパスと依存関係を自動的に検出するためです。 - ランタイム時にライブラリを見つける必要がある場合は、
CMAKE_RUNTIME_SEARCH_DIRECTORY
を使用する: これは、実行可能ファイルや共有ライブラリがランタイム時に共有ライブラリを探す場所を指定するためです。 - インストールされたライブラリに依存する場合は、
CMAKE_INSTALL_RPATH
を使用する: これは、実行可能ファイルや共有ライブラリがインストールされたときに RPATH が設定されるためです。 - 移植性を重視する場合は、
CMAKE_BUILD_RPATH_USE_ORIGIN
を使用する: これは、実行可能ファイルや共有ライブラリが同じビルツリー内の他のライブラリに依存している場合にのみ機能します。