【保存版】CMakeで外部ライブラリを扱う:IMPORTED_OBJECTS vs ターゲット依存関係 vs FIND_LIBRARY徹底比較


CMake の "IMPORTED_OBJECTS" プロパティは、ターゲットが他のプロジェクトやライブラリから生成された外部オブジェクトファイルに依存関係を持つように設定するために使用されます。 これらの外部オブジェクトファイルは、静的ライブラリ、共有ライブラリ、または実行可能ファイルである可能性があります。

重要なポイント

  • このプロパティは、クロスプラットフォームビルドで特に役立ちます。
  • IMPORTED_OBJECTS プロパティは、ターゲットのリンカコマンドラインにオブジェクトファイルを自動的に追加します。
  • これらのオブジェクトファイルは、他のプロジェクトまたはライブラリによって生成されている必要があります。
  • IMPORTED_OBJECTS プロパティは、ターゲットが直接生成していないオブジェクトファイルを指定するために使用されます。

構文

set_property(TARGET ターゲット_名 PROPERTY IMPORTED_OBJECTS ファイル名1 ファイル名2 ...)

set_property(TARGET myapp PROPERTY IMPORTED_OBJECTS foo.lib bar.a)

この例では、myapp ターゲットは foo.libbar.a という外部ライブラリファイルに依存関係を持つようになります。

  • IMPORTED_OBJECTS プロパティは、ターゲットの構成ごとに設定できます。
  • IMPORTED_OBJECTS プロパティは、複数のターゲットに設定できます。
  • オブジェクトファイルは、絶対パスまたは相対パスで指定できます。
  • IMPORTED_OBJECTS プロパティは、ターゲットのソースディレクトリに存在する必要はありません。
  • ターゲットが依存する外部ライブラリの場所を指定するには、FIND_LIBRARY モジュールを使用できます。
  • IMPORTED_OBJECTS プロパティに加えて、IMPORTED_LINK_FLAGS プロパティを使用して、ターゲットのリンカコマンドラインに外部ライブラリに必要なフラグを追加することもできます。


cmake_minimum_required(VERSION 3.10)

project(myapp)

set(SOURCE_FILES main.cpp)
set(TARGET_LINK_LIBRARIES foo.lib bar.a)

add_executable(myapp ${SOURCE_FILES})

例 2: 共有ライブラリへの依存関係

この例では、myapp ターゲットは libfoo.solibbar.so という共有ライブラリファイルに依存関係を持ちます。

cmake_minimum_required(VERSION 3.10)

project(myapp)

set(SOURCE_FILES main.cpp)
find_package(Foo REQUIRED)
find_package(Bar REQUIRED)

target_link_libraries(myapp libfoo:: Foo::LIBRARIES libbar:: Bar::LIBRARIES)

add_executable(myapp ${SOURCE_FILES})

例 3: 実行可能ファイルへの依存関係

この例では、myapp ターゲットは foobar という実行可能ファイルに依存関係を持ちます。

cmake_minimum_required(VERSION 3.10)

project(myapp)

set(SOURCE_FILES main.cpp)

set_property(TARGET myapp PROPERTY IMPORTED_OBJECTS foo bar)

add_executable(myapp ${SOURCE_FILES})
  • CMake ドキュメントやチュートリアルを参照して、詳細な情報を確認することをお勧めします。
  • 具体的なコードは、プロジェクトの構造や使用しているライブラリによって異なります。
  • これらの例は、あくまでも基本的な例であり、実際のプロジェクトで使用されるコードはより複雑になる可能性があります。


代替方法

"IMPORTED_OBJECTS" プロパティにはいくつかの代替方法があります。

ターゲット依存関係

ターゲット依存関係を使用して、ターゲットを他のターゲットに依存させることができます。 これにより、ターゲットは他のターゲットによって生成されたオブジェクトファイルに自動的にリンクされます。

add_executable(myapp main.cpp)
add_executable(foo foo.cpp)
add_executable(bar bar.cpp)

add_dependencies(myapp foo bar)

この例では、myapp ターゲットは foo ターゲットと bar ターゲットに依存関係を持ちます。 これにより、myapp ターゲットは foo.obar.o というオブジェクトファイルに自動的にリンクされます。

FIND_LIBRARY モジュール

FIND_LIBRARY モジュールを使用して、外部ライブラリの場所を指定することができます。 これにより、ターゲットは自動的にライブラリに必要なオブジェクトファイルにリンクされます。

cmake_minimum_required(VERSION 3.10)

project(myapp)

set(SOURCE_FILES main.cpp)
find_package(Foo REQUIRED)
find_package(Bar REQUIRED)

target_link_libraries(myapp libfoo:: Foo::LIBRARIES libbar:: Bar::LIBRARIES)

add_executable(myapp ${SOURCE_FILES})

手動リンカコマンド

ターゲットのリンカコマンドラインに手動でオブジェクトファイルを指定することができます。

add_executable(myapp main.cpp)
target_link_libraries(myapp foo.lib bar.a)

この例では、myapp ターゲットは foo.libbar.a というオブジェクトファイルに手動でリンクされます。

最適な方法を選択

使用する方法は、プロジェクトの構造や使用しているライブラリによって異なります。

  • 手動リンカコマンド は、最も柔軟な方法ですが、最も複雑でエラーが発生しやすい方法でもあります。
  • FIND_LIBRARY モジュール は、クロスプラットフォームビルドに役立ちますが、すべてのライブラリが FIND_LIBRARY モジュールでサポートされているわけではありません。
  • ターゲット依存関係 は、最も単純でわかりやすい方法ですが、複雑なプロジェクトでは管理が難しくなる可能性があります。