CMakeで他のCMakeプロジェクトによって生成されたオブジェクトファイルを使用する

2024-04-02

CMake の IMPORTED_OBJECTS プロパティ

IMPORTED_OBJECTS プロパティは、外部で生成されたオブジェクトファイルを CMake プロジェクトに組み込むための機能です。これは、サードパーティ製のライブラリや、他の CMake プロジェクトによって生成されたオブジェクトファイルを使用する場合に役立ちます。

設定方法

IMPORTED_OBJECTS プロパティは、target_properties() コマンドを使用して、ターゲットに設定します。以下の例は、my_library という名前のターゲットに、object1.oobject2.o という名前のオブジェクトファイルを組み込む方法を示しています。

target_properties(my_library PROPERTIES IMPORTED_OBJECTS object1.o object2.o)

オブジェクトファイルの場所

IMPORTED_OBJECTS プロパティで指定されたオブジェクトファイルは、プロジェクトのソースツリー内または外部に存在することができます。オブジェクトファイルがプロジェクトのソースツリー内に存在する場合は、相対パスで指定できます。オブジェクトファイルが外部に存在する場合は、絶対パスで指定する必要があります。

オブジェクトファイルの属性

IMPORTED_OBJECTS プロパティで指定されたオブジェクトファイルには、以下の属性を設定することができます。

  • INTERFACE_COMPILE_OPTIONS: オブジェクトファイルのコンパイル時に使用されたオプションを指定します。
  • INTERFACE_INCLUDE_DIRECTORIES: オブジェクトファイルのコンパイル時に使用されたインクルードディレクトリを指定します。
  • INTERFACE_LINK_LIBRARIES: オブジェクトファイルのリンク時に使用されたライブラリを指定します。

使用例

以下は、IMPORTED_OBJECTS プロパティを使用する例です。

例 1: サードパーティ製のライブラリを使用する

# サードパーティ製のライブラリのヘッダーファイルをインクルードする
include_directories(${CMAKE_SOURCE_DIR}/thirdparty/my_library/include)

# サードパーティ製のライブラリのオブジェクトファイルをリンクする
target_link_libraries(my_executable PRIVATE ${CMAKE_SOURCE_DIR}/thirdparty/my_library/libmy_library.a)

# サードパーティ製のライブラリのオブジェクトファイルの属性を設定する
target_properties(my_executable PROPERTIES 
    INTERFACE_COMPILE_OPTIONS "-DUSE_MY_LIBRARY"
    INTERFACE_LINK_LIBRARIES "-Wl,-rpath,${CMAKE_SOURCE_DIR}/thirdparty/my_library/lib")

例 2: 他の CMake プロジェクトによって生成されたオブジェクトファイルを使用する

# 他の CMake プロジェクトのビルドディレクトリを指定する
set(OTHER_PROJECT_BUILD_DIR ${CMAKE_BINARY_DIR}/other_project)

# 他の CMake プロジェクトによって生成されたオブジェクトファイルを組み込む
target_properties(my_executable PROPERTIES IMPORTED_OBJECTS 
    ${OTHER_PROJECT_BUILD_DIR}/libmy_library.a)

# 他の CMake プロジェクトによって生成されたオブジェクトファイルの属性を設定する
target_properties(my_executable PROPERTIES 
    INTERFACE_COMPILE_OPTIONS "-DUSE_MY_LIBRARY"
    INTERFACE_LINK_LIBRARIES "-Wl,-rpath,${OTHER_PROJECT_BUILD_DIR}/lib")

注意事項

  • IMPORTED_OBJECTS プロパティは、CMake バージョン 3.14 以降でサポートされています。
  • IMPORTED_OBJECTS プロパティで指定されたオブジェクトファイルは、プロジェクトのビルドツリーにコピーされません。
  • IMPORTED_OBJECTS プロパティで指定されたオブジェクトファイルは、プロジェクトのインストール時にインストールされません。


CMake の IMPORTED_OBJECTS プロパティを使用したサンプルコード

サードパーティ製ライブラリを使用する

# サードパーティ製ライブラリのヘッダーファイルをインクルードする
include_directories(${CMAKE_SOURCE_DIR}/thirdparty/my_library/include)

# サードパーティ製ライブラリのオブジェクトファイルをリンクする
target_link_libraries(my_executable PRIVATE ${CMAKE_SOURCE_DIR}/thirdparty/my_library/libmy_library.a)

# サードパーティ製ライブラリのオブジェクトファイルの属性を設定する
target_properties(my_executable PROPERTIES 
    INTERFACE_COMPILE_OPTIONS "-DUSE_MY_LIBRARY"
    INTERFACE_LINK_LIBRARIES "-Wl,-rpath,${CMAKE_SOURCE_DIR}/thirdparty/my_library/lib")

この例では、my_library という名前のサードパーティ製ライブラリを使用しています。

  • include_directories() コマンドを使用して、サードパーティ製ライブラリのヘッダーファイルがインクルードされるように設定しています。
  • target_link_libraries() コマンドを使用して、サードパーティ製ライブラリのオブジェクトファイルがリンクされるように設定しています。
  • target_properties() コマンドを使用して、サードパーティ製ライブラリのオブジェクトファイルの属性を設定しています。

属性

  • INTERFACE_COMPILE_OPTIONS:** オブジェクトファイルのコンパイル時に使用されたオプションを指定します。この例では、-DUSE_MY_LIBRARYオプションを指定して、my_library` ライブラリが使用されていることをコンパイラに指示しています。
  • INTERFACE_LINK_LIBRARIES:** オブジェクトファイルのリンク時に使用されたライブラリを指定します。この例では、-Wl,-rpath,${CMAKE_SOURCE_DIR}/thirdparty/my_library/libオプションを指定して、リンカーがmy_library` ライブラリを見つける場所を指示しています。

他の CMake プロジェクトによって生成されたオブジェクトファイルを使用する

# 他の CMake プロジェクトのビルドディレクトリを指定する
set(OTHER_PROJECT_BUILD_DIR ${CMAKE_BINARY_DIR}/other_project)

# 他の CMake プロジェクトによって生成されたオブジェクトファイルを組み込む
target_properties(my_executable PROPERTIES IMPORTED_OBJECTS 
    ${OTHER_PROJECT_BUILD_DIR}/libmy_library.a)

# 他の CMake プロジェクトによって生成されたオブジェクトファイルの属性を設定する
target_properties(my_executable PROPERTIES 
    INTERFACE_COMPILE_OPTIONS "-DUSE_MY_LIBRARY"
    INTERFACE_LINK_LIBRARIES "-Wl,-rpath,${OTHER_PROJECT_BUILD_DIR}/lib")

説明

この例では、other_project という名前の別の CMake プロジェクトによって生成されたオブジェクトファイルを使用しています。

  • set() コマンドを使用して、OTHER_PROJECT_BUILD_DIR 変数に、other_project プロジェクトのビルドディレクトリを設定しています。
  • target_properties() コマンドを使用して、other_project プロジェクトによって生成されたオブジェクトファイル libmy_library.amy_executable ターゲットに組み込んでいます。
  • target_properties() コマンドを使用して、other_project プロジェクトによって生成されたオブジェクトファイルの属性を設定しています。

属性

  • INTERFACE_COMPILE_OPTIONS:** オブジェクトファイルのコンパイル時に使用されたオプションを指定します。この例では、-DUSE_MY_LIBRARYオプションを指定して、my_library` ライブラリが使用されていることをコンパイラに指示しています。
  • INTERFACE_LINK_LIBRARIES:** オブジェクトファイルのリンク時に使用されたライブラリを指定します。この例では、-Wl,-rpath,${OTHER_PROJECT_BUILD_DIR}/libオプションを指定して、リンカーがmy_library` ライブラリを見つける場所を指示しています。

この URL には、IMPORTED_OBJECTS プロパティを使用したさまざまなサンプルコードがあります。



CMake で外部オブジェクトファイルを扱うその他の方法

サードパーティ製ライブラリの場合

サードパーティ製ライブラリの CMake プロジェクトを使用する

多くのサードパーティ製ライブラリは、CMake プロジェクトファイルを提供しています。これらのプロジェクトファイルを使用すると、サードパーティ製ライブラリを CMake プロジェクトに簡単に組み込むことができます。

例:

add_subdirectory(${CMAKE_SOURCE_DIR}/thirdparty/my_library)

target_link_libraries(my_executable PRIVATE my_library)

サードパーティ製ライブラリのバイナリパッケージを使用する

多くのサードパーティ製ライブラリは、バイナリパッケージとして提供されています。バイナリパッケージを使用すると、CMake プロジェクトファイルを変更することなく、サードパーティ製ライブラリをプロジェクトに組み込むことができます。

例:

find_package(my_library REQUIRED)

target_link_libraries(my_executable PRIVATE my_library::my_library)

他の CMake プロジェクトによって生成されたオブジェクトファイルの場合

add_custom_command() コマンドを使用して、他の CMake プロジェクトによって生成されたオブジェクトファイルをプロジェクトに組み込むことができます。

例:

add_custom_command(
    OUTPUT ${CMAKE_BINARY_DIR}/libmy_library.a
    COMMAND ${CMAKE_COMMAND} -E make -C ${OTHER_PROJECT_BUILD_DIR}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

target_link_libraries(my_executable PRIVATE ${CMAKE_BINARY_DIR}/libmy_library.a)

add_custom_target() コマンドを使用して、他の CMake プロジェクトによって生成されたオブジェクトファイルをプロジェクトに組み込むことができます。

例:

add_custom_target(my_library
    COMMAND ${CMAKE_COMMAND} -E make -C ${OTHER_PROJECT_BUILD_DIR}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

add_dependencies(my_executable my_library)

target_link_libraries(my_executable PRIVATE ${OTHER_PROJECT_BUILD_DIR}/libmy_library.a)

その他の方法

上記以外にも、以下の方法で外部オブジェクトファイルを扱うことができます。

  • ExternalProject モジュールを使用する
  • FetchContent モジュールを使用する
  • サードパーティ製のビルドツールを使用する
  • サードパーティ製ライブラリの CMake プロジェクトファイルが提供されている場合は、そのプロジェクトファイルを使用するのが最も簡単です。
  • サードパーティ製ライブラリのバイナリパッケージが提供されている場合は、バイナリパッケージを使用するのが最も簡単です。
  • 他の CMake プロジェクトによって生成されたオブジェクトファイルの場合は、add_custom_command() コマンドまたは add_custom_target() コマンドを使用するのが一般的です。

IMPORTED_OBJECTS プロパティは、外部オブジェクトファイルを CMake プロジェクトに組み込むための便利な方法ですが、他にもいくつかの方法があります。どの方法を選択するべきかは、状況によって異なります。




CMakeのCommandsにおけるuse_mangled_mesa()

use_mangled_mesa() は CMake の Commands における関数で、Mesa ライブラリの mangled シンボル名を解決するために使用されます。Mesa は OpenGL の実装であり、古いバージョンの Mesa ではシンボル名が mangled されるため、use_mangled_mesa() を使用してこれらのシンボル名を解決する必要があります。



CMake で変数を削除する3つの方法:unset() 以外にも使えるテクニック

<variable_name> は、削除したい変数の名前です。変数の名前は、文字、数字、下線(_)で構成され、先頭に数字以外のアクティブ文字が来る必要があります。変数の削除この例では、MY_VAR という変数を作成し、"Hello, world!" という値を設定します。その後、unset() コマンドを使用して MY_VAR を削除します。2番目の message() コマンドは、MY_VAR が削除されたことを確認するために使用されます。


CMakeコマンド mark_as_advanced() の詳細解説

mark_as_advanced() は、CMakeプロジェクトで特定のキャッシュ変数を "詳細設定" としてマークするために使用されるコマンドです。このコマンドによって、GUI ツールでこれらの変数はデフォルトでは表示されなくなり、ユーザーは "詳細設定" オプションを有効にするまで編集できなくなります。


プログラミング初心者でもわかる!CMake の "set_directory_properties()" コマンドの使い方

set_directory_properties() コマンドは、CMakeプロジェクト内のディレクトリとサブディレクトリにプロパティを設定するために使用されます。これらのプロパティは、ビルドプロセス、インストール、その他の CMake 動作を制御するために使用できます。


CMake try_compile() を使って特定のライブラリがインストールされているかどうかを確認する方法

try_compile() は、CMake の強力なコマンドの一つで、コードを実際にコンパイルすることなく、コンパイルが成功するかどうかを確認することができます。これは、特定のコンパイラやオプションがシステム上で使用可能かどうかをテストしたり、コードの移植性を検証したりする際に非常に便利です。



CMake の共有ライブラリのリンカフラグを初期化する変数 CMAKE_SHARED_LINKER_FLAGS_CONFIG_INIT

CMAKE_SHARED_LINKER_FLAGS_CONFIG_INIT は、CMake のビルドプロセスにおいて、共有ライブラリのリンカフラグを初期化する変数です。この変数は、toolchain file 内で設定され、CMake がビルドツリーを初めて構成する際に使用されます。CMake は、環境やターゲットプラットフォームに基づいて、この変数の値に内容を前置または付加することがあります。


CMakeのCTEST_CUSTOM_WARNING_EXCEPTION変数を使って警告メッセージを無視する方法

変数の役割CTEST_CUSTOM_WARNING_EXCEPTIONは、正規表現のリストとして設定されます。テストの実行中に、CTestは各警告メッセージをこのリストと照合します。メッセージがリスト内のいずれかの正規表現に一致した場合、その警告は出力されません。


CMake try_compile() を使って特定のライブラリがインストールされているかどうかを確認する方法

try_compile() は、CMake の強力なコマンドの一つで、コードを実際にコンパイルすることなく、コンパイルが成功するかどうかを確認することができます。これは、特定のコンパイラやオプションがシステム上で使用可能かどうかをテストしたり、コードの移植性を検証したりする際に非常に便利です。


CMakeにおける CMAKE_Fortran_MODDIR_FLAG 変数の詳細解説

CMAKE_Fortran_MODDIR_FLAGは、Fortranモジュールの出力ディレクトリを指定するために使用するCMake変数です。この変数は、Fortranコンパイラにモジュールファイルを保存する場所を指示するために使用されます。


CMake find_libraryコマンドとfind_packageモジュールの比較

find_library() コマンドは、CMake で外部ライブラリを見つけるために使用されます。これは、プロジェクトに必要なライブラリを自動的に検出して、ビルドプロセスを簡略化するのに役立ちます。コマンドフォーマット<VAR>: 検索結果を格納する変数名