CMake: ツールチェーンファイルでモジュール用リンカフラグを初期化 - CMAKE_MODULE_LINKER_FLAGS_INITの使い方


CMAKE_MODULE_LINKER_FLAGS_INIT は、CMake における変数の一つで、モジュール作成時に使用されるリンカフラグを初期化する際に用いられます。この変数は CMake 3.7 以降で導入され、主にツールチェーンファイルで設定されます。

役割

CMAKE_MODULE_LINKER_FLAGS_INIT は、ビルドツリーが初めて設定される際に、CMAKE_MODULE_LINKER_FLAGS キャッシュエントリの初期値を設定する役割を担います。

設定方法

CMAKE_MODULE_LINKER_FLAGS_INIT は、ツールチェーンファイル内で以下の形式で設定します。

set(CMAKE_MODULE_LINKER_FLAGS_INIT "<リンカフラグ>")

set(CMAKE_MODULE_LINKER_FLAGS_INIT "-Wl,-rpath,$ORIGIN")

この例では、-Wl,-rpath,$ORIGIN というリンカフラグが CMAKE_MODULE_LINKER_FLAGS_INIT に設定されます。このフラグは、リンカに対して実行可能ファイルが検索されるパスを指定します。

  • モジュール作成時に使用されるリンカフラグを個別に設定したい場合は、SET_TARGET_PROPERTIES コマンドを用いることができます。
  • CMake は、環境やターゲットプラットフォームに基づいて CMAKE_MODULE_LINKER_FLAGS_INIT の値に前置または後置処理を行う場合があります。

プログラミング例

以下の例は、CMAKE_MODULE_LINKER_FLAGS_INIT を使用してモジュール作成時に使用されるリンカフラグを設定する方法を示しています。

cmake_minimum_required(VERSION 3.7)

project(myproject)

set(CMAKE_MODULE_LINKER_FLAGS_INIT "-Wl,-rpath,$ORIGIN")

add_executable(mymodule mymodule.cpp)

この例では、mymodule というモジュールが作成されます。このモジュールは、-Wl,-rpath,$ORIGIN というリンカフラグを使用して作成されます。

CMAKE_MODULE_LINKER_FLAGS_INIT は、モジュール作成時に使用されるリンカフラグを初期化するために使用される CMake 変数です。この変数は、ツールチェーンファイル内で設定されます。



ツールチェーンファイル

# ツールチェーンファイル (toolchain.cmake)

cmake_minimum_required(VERSION 3.7)

set(CMAKE_MODULE_LINKER_FLAGS_INIT "-Wl,-rpath,$ORIGIN")

CMakeLists.txt

# CMakeLists.txt

cmake_minimum_required(VERSION 3.7)

project(myproject)

include(toolchain.cmake)

add_executable(mymodule mymodule.cpp)

mymodule.cpp

# mymodule.cpp

#include <iostream>

int main() {
  std::cout << "Hello, world!" << std::endl;
  return 0;
}

上記コードを以下のようにビルドして実行します。

mkdir build
cd build
cmake ..
make
./mymodule

このコードを実行すると、以下の出力が表示されます。

Hello, world!

この例では、toolchain.cmake ファイルで CMAKE_MODULE_LINKER_FLAGS_INIT-Wl,-rpath,$ORIGIN というリンカフラグを設定しています。このフラグは、リンカに対して実行可能ファイルが検索されるパスを指定します。

  • CMAKE_MODULE_LINKER_FLAGS_INIT に設定できるリンカフラグは、使用しているツールチェーンによって異なります。
  • toolchain.cmake ファイルは、プロジェクトディレクトリとは別の場所に置くこともできます。
  • この例では、mymodule モジュールが ORIGIN ディレクトリ内に存在することを想定しています。
# CMakeLists.txt

cmake_minimum_required(VERSION 3.7)

project(myproject)

include(toolchain.cmake)

set(CMAKE_BUILD_TYPE Debug)

add_executable(mymodule_debug mymodule.cpp)

set(CMAKE_BUILD_TYPE Release)

add_executable(mymodule_release mymodule.cpp)

このコードを実行すると、以下のようなファイルが生成されます。

  • build/mymodule_release
  • build/mymodule_debug

mymodule_debug はデバッグ版のモジュールであり、mymodule_release はリリース版のモジュールです。



SET_TARGET_PROPERTIES コマンド

個別のモジュールに対してリンカフラグを設定したい場合は、SET_TARGET_PROPERTIES コマンドを使用することができます。

set_target_properties(mymodule PROPERTIES LINKER_FLAGS "-Wl,-rpath,$ORIGIN")

この例では、mymodule というモジュールに対して -Wl,-rpath,$ORIGIN というリンカフラグが設定されます。

target_link_libraries コマンド

ライブラリをリンクする際に、そのライブラリに関連するリンカフラグを指定することができます。

target_link_libraries(mymodule <ライブラリ名> PRIVATE)

この例では、mymodule というモジュールに ライブラリ名 をリンクします。PRIVATE オプションを指定することで、ライブラリ名 に関連するリンカフラグが mymodule のリンカフラグに追加されます。

ツールチェーンファイル

ツールチェーンファイル内で CMAKE_TARGET_LINKER_FLAGS 変数を設定することで、全てのモジュールに対して共通のリンカフラグを設定することができます。

# ツールチェーンファイル (toolchain.cmake)

cmake_minimum_required(VERSION 3.7)

set(CMAKE_TARGET_LINKER_FLAGS "-Wl,-rpath,$ORIGIN")

この例では、全てのモジュールに対して -Wl,-rpath,$ORIGIN というリンカフラグが設定されます。

CMake プロジェクトファイル

CMake プロジェクトファイル内で target_link_libraries コマンドを使用して、個別のモジュールに対してリンカフラグを設定することができます。

# CMakeLists.txt

cmake_minimum_required(VERSION 3.7)

project(myproject)

add_executable(mymodule mymodule.cpp)

target_link_libraries(mymodule "-Wl,-rpath,$ORIGIN")

環境変数

LDFLAGS 環境変数を使用して、全てのモジュールに対して共通のリンカフラグを設定することができます。

export LDFLAGS="-Wl,-rpath,$ORIGIN"

CMAKE_MODULE_LINKER_FLAGS_INIT は、モジュール作成時に使用されるリンカフラグを初期化するために便利な変数ですが、状況に応じて上記の代替方法を使用することもできます。

  • 詳細については、CMake のドキュメントを参照してください。
  • 複数の代替方法を組み合わせることもできます。
  • 使用する代替方法は、プロジェクトの規模や複雑さによって異なります。