export()コマンドでCMakeを使いこなす!ターゲット&パッケージのエクスポートテクニック
CMakeのexport()
コマンドは、プロジェクトビルドツリーからターゲットやパッケージをエクスポートするために使用されます。エクスポートされたターゲットやパッケージは、他のプロジェクトから直接利用することができます。これは、依存関係の管理やライブラリの共有を容易にするのに役立ちます。
構文
export()
コマンドには、主に2つの形式があります。
- ターゲットのエクスポート
export(TARGETS <target1> [target2 [...]] [NAMESPACE <namespace>] [APPEND] FILE <filename> [EXPORT_LINK_INTERFACE_LIBRARIES])
この形式は、指定されたターゲットをエクスポートするために使用されます。
- パッケージのエクスポート
export(PACKAGE <PackageName>)
この形式は、指定されたパッケージをエクスポートするために使用されます。
オプション
- EXPORT_LINK_INTERFACE_LIBRARIES
インターフェースライブラリのリンク情報をエクスポートします。 - FILE
エクスポート内容を出力するファイル名を指定します。 - APPEND
既存のファイルにエクスポート内容を追記します。 - NAMESPACE
エクスポートされたターゲット名に接頭辞を追加します。
詳細
ターゲットのエクスポート
export(TARGETS)
コマンドは、指定されたターゲットに関する情報をエクスポートします。エクスポートされる情報は、ターゲット名、ライブラリ、ヘッダーファイル、依存関係などです。この情報は、他のプロジェクトがターゲットをインポートするために使用されます。例:
export(TARGETS mylibrary myapp)
この例では、
mylibrary
とmyapp
ターゲットがエクスポートされます。パッケージのエクスポート
export(PACKAGE)
コマンドは、指定されたパッケージに関する情報をエクスポートします。エクスポートされる情報は、パッケージ名、バージョン、ライブラリ、ヘッダーファイル、依存関係などです。この情報は、他のプロジェクトがパッケージを検索するために使用されます。export(PACKAGE MyPackage 1.0.0)
この例では、
MyPackage
という名前のパッケージがバージョン1.0.0としてエクスポートされます。
- エクスポートされたターゲットやパッケージは、他のプロジェクトで使用される前にインストールする必要があります。
export()
コマンドは、プロジェクトのビルドツリー内でのみ使用できます。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject 1.0.0)
add_library(mylibrary STATIC src/mylibrary.c)
add_executable(myapp src/myapp.c)
target_link_libraries(myapp mylibrary)
install(TARGETS mylibrary myapp DESTINATION lib)
export(TARGETS mylibrary myapp FILE MyTargets.cmake)
例2:パッケージのエクスポート
この例では、MyPackage
という名前のパッケージをエクスポートし、バージョンを1.0.0に設定します。
# CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyPackage 1.0.0)
add_library(mylibrary STATIC src/mylibrary.c)
add_executable(myapp src/myapp.c)
target_link_libraries(myapp mylibrary)
install(TARGETS mylibrary myapp DESTINATION lib)
install(FILES mypackage.h DESTINATION include)
export(PACKAGE MyPackage)
- 詳細については、CMakeドキュメントを参照することをお勧めします。
- 上記の例はあくまで基本的な使用方法を示しています。実際には、プロジェクトの複雑さに応じて、より多くのオプションやコマンドが必要になる場合があります。
FindPackageモジュール
- 欠点
- すべてのライブラリやパッケージがFindPackageモジュールでサポートされているわけではない。
- FindPackageモジュールの動作を制御するのが難しい場合がある。
- 利点
- サードパーティ製ライブラリやパッケージを簡単にインポートできる。
- プラットフォーム固有のビルド設定を自動的に処理できる。
- CMakeLists.txtファイルが簡潔になる。
例
find_package(MyPackage REQUIRED)
target_link_libraries(myapp MyPackage::MyTarget)
インターフェースライブラリ
- 欠点
- インターフェースライブラリの作成には、追加の作業が必要となる。
- 古いバージョンのCMakeではサポートされていない。
- 利点
- ヘッダーファイルのみを公開することで、ライブラリの内部実装を隠蔽できる。
- ライブラリの依存関係を明確にすることができる。
例
add_library(mylibrary INTERFACE src/mylibrary.h)
add_executable(myapp src/myapp.c)
target_link_libraries(myapp mylibrary)
手動設定
- 欠点
- 複雑でエラーが発生しやすい。
- コードの冗長性が増す。
- 利点
- 完全な制御が可能。
例
include_directories(${MYLIBRARY_INCLUDE_DIR})
target_link_libraries(myapp ${MYLIBRARY_LIB})
サードパーティ製ツール
- 欠点
- 追加のツールをインストールして設定する必要がある。
- CMakeとの互換性が保証されない。
- 利点
- CMake以外のツールでプロジェクトをビルドする場合に役立つ。
- 独自のビルドシステムを構築する場合に役立つ。
例
export()
コマンドは、多くの場合において便利なツールですが、状況によっては代替手段の方が適している場合があります。上記で紹介した代替方法を検討し、プロジェクトのニーズに合ったものを選択してください。
- 最適な方法は、プロジェクトの要件と開発者の好みによって異なります。
- 上記以外にも、状況によっては他の代替方法が存在する可能性があります。