CMake: IMPORT_PREFIXを使いこなす! ターゲットライブラリのインポートを自在に制御


IMPORT_PREFIX の役割

IMPORT_PREFIX は、CMake がインポートライブラリを検索およびロードする際に使用するパスを制御するために重要です。デフォルトでは、CMake はインポートライブラリを <install_dir>/lib ディレクトリから検索します。しかし、IMPORT_PREFIX を設定することで、このデフォルトの検索パスを変更することができます。

IMPORT_PREFIX の設定方法

IMPORT_PREFIX は、以下の方法で設定することができます。

  • ターゲットプロパティとして設定
set_target_properties(mytarget PROPERTIES IMPORT_PREFIX "custom_prefix")
  • install(TARGETS) コマンドのオプションとして設定
install(TARGETS mytarget DESTINATION lib IMPORT_PREFIX "custom_prefix")
  • target_link_libraries() コマンドのオプションとして設定
target_link_libraries(mytarget AnotherTarget IMPORT_PREFIX "custom_prefix")

IMPORT_PREFIX の使用例

以下の例は、IMPORT_PREFIX を使用して、インポートライブラリ custom_lib.dll の検索パスを変更する方法を示しています。

set_target_properties(mytarget PROPERTIES IMPORT_PREFIX "custom_prefix")

target_link_libraries(mytarget custom_lib)

この例では、mytarget ターゲットは custom_lib.dll ライブラリにリンクされますが、CMake はライブラリを <install_dir>/lib ディレクトリではなく、<install_dir>/custom_prefix/lib ディレクトリから検索します。

  • IMPORT_PREFIX を設定する場合は、そのパスが正しいことを確認する必要があります。間違ったパスを設定すると、CMake がライブラリを見つけることができなくなり、エラーが発生する可能性があります。
  • IMPORT_PREFIX は、インポートライブラリのみを対象としており、通常のライブラリには適用されないことに注意してください。


ライブラリのビルドとインストール

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_library(mylib STATIC mylib.cpp)

target_link_libraries(mylib AnotherLib)

install(TARGETS mylib DESTINATION lib)

このコードは、mylib という名前のライブラリをビルドし、lib ディレクトリにインストールします。ライブラリは mylib.cpp ファイルから作成され、AnotherLib ライブラリにリンクされます。

IMPORT_PREFIX を設定してターゲットをビルド

cmake_minimum_required(VERSION 3.10)

project(myproject)

find_package(CustomLib REQUIRED)

add_executable(mytarget mytarget.cpp)

target_link_libraries(mytarget mylib CustomLib::CustomLib)

set_target_properties(mytarget PROPERTIES IMPORT_PREFIX "custom_prefix")

install(TARGETS mytarget DESTINATION bin)

このコードは、mytarget という名前の実行可能ファイルをビルドし、bin ディレクトリにインストールします。実行可能ファイルは mytarget.cpp ファイルから作成され、mylib ライブラリと CustomLib ライブラリにリンクされます。

IMPORT_PREFIXset_target_properties コマンドを使用して設定されています。この設定により、CMake は CustomLib::CustomLib ライブラリを <install_dir>/custom_prefix/lib ディレクトリから検索します。

実行可能ファイルを実行

./bin/mytarget

このコマンドは mytarget 実行可能ファイルをを実行します。実行可能ファイルは mylib ライブラリと CustomLib ライブラリを正しくロードできることを確認します。

説明

  • 実行可能ファイルをインストールおよび実行する方法
  • ターゲットをライブラリにリンクする方法
  • find_package コマンドを使用して外部ライブラリを検索する方法
  • set_target_properties コマンドを使用して IMPORT_PREFIX を設定する方法
  • IMPORT_PREFIX を使用して、インポートライブラリの検索パスを変更する方法

以下の例は、"IMPORT_PREFIX" をさまざまな状況で使用する方法を示しています。

  • 複数のインポートライブラリを持つターゲット
set_target_properties(mytarget PROPERTIES IMPORT_PREFIX_CUSTOM_LIB "custom_prefix")
set_target_properties(mytarget PROPERTIES IMPORT_PREFIX_ANOTHER_LIB "another_prefix")

target_link_libraries(mytarget CustomLib::CustomLib AnotherLib)
  • インポートライブラリのバージョン指定
set(CUSTOM_LIB_VERSION 1.0.0)

set_target_properties(mytarget PROPERTIES IMPORT_PREFIX_CUSTOM_LIB "custom_prefix;${CUSTOM_LIB_VERSION}")

target_link_libraries(mytarget CustomLib::CustomLib)
  • インポートライブラリのデバッグ/リリース構成
set(CMAKE_BUILD_TYPE Debug)

set_target_properties(mytarget PROPERTIES IMPORT_PREFIX_CUSTOM_LIB_DEBUG "custom_prefix_debug")
set_target_properties(mytarget PROPERTIES IMPORT_PREFIX_CUSTOM_LIB_RELEASE "custom_prefix_release")

target_link_libraries(mytarget CustomLib::CustomLib)

これらの例は、"IMPORT_PREFIX" の柔軟性を示しています。さまざまな要件に合わせて設定をカスタマイズすることができます。



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

最も簡単な代替方法は、インポートライブラリのデフォルトのインストールパスを変更することです。これは、CMAKE_INSTALL_PREFIX またはプロジェクト固有の CMAKE_INSTALL_PREFIX_<CONFIG> 変数を使用して行うことができます。

利点:

  • 他の方法と比べて設定が簡単
  • シンプルで理解しやすい

欠点:

  • すべてのインポートライブラリに同じパスを使用することになる
  • システム全体に影響を与える可能性がある


set(CMAKE_INSTALL_PREFIX "/custom/install/path")

install(TARGETS mytarget DESTINATION lib)

RPATH を使用する

RPATH は、実行可能ファイルがライブラリを探す場所を指定するランタイムパスです。これは、target_link_libraries コマンドの LINK_FLAGS オプションを使用して設定できます。

  • システム全体に影響を与えない
  • 特定の実行可能ファイルに必要なライブラリのみを指定できる
  • 実行可能ファイルが正しい場所にインストールされている必要がある
  • 設定が複雑になる可能性がある


target_link_libraries(mytarget mylib PRIVATE_LINK_FLAGS "-Wl,-rpath=/custom/lib/path")

インストールマニフェストを使用する

インストールマニフェストは、インポートライブラリの検索パスを指定する XML ファイルです。これは、install(TARGETS) コマンドの MANIFEST オプションを使用して設定できます。

  • 依存関係をより細かく制御できる
  • RPATHよりも柔軟性が高い
  • インストールマニフェストをメンテナンスする必要がある
  • 設定が複雑になる可能性がある


install(TARGETS mytarget DESTINATION lib MANIFEST "mytarget.manifest")

カスタムインストーラーを使用する

最も高度な代替方法は、カスタムインストーラーを使用してインポートライブラリを配置することです。これにより、完全な制御が可能になりますが、複雑な作業となります。

  • 複雑な要件にも対応できる
  • 完全な制御が可能
  • 開発とメンテナンスに多くの時間と労力が必要


CMake ではカスタムインストーラーを直接作成することはできませんが、CMake を他のビルドシステム (例: Ninja) と組み合わせることで実現できます。

"IMPORT_PREFIX" は多くの場合、インポートライブラリの検索パスを制御するための適切な選択肢ですが、状況によっては代替手段の方が適している場合があります。 上記の代替方法とその利点と欠点を比較検討し、プロジェクトのニーズに合った最良の方法を選択してください。

  • 複雑なプロジェクトの場合は、専門家の助けを求めることをお勧めします。
  • 上記以外にも、CMake のバージョンやプラットフォームによって利用可能な代替方法がある場合があります。