【CMake】ターゲットのリンカオプションを徹底解説!「LINK_OPTIONS」プロパティの仕組みと詳細な設定方法


CMakeの「Properties: Targets」における「LINK_OPTIONS」は、ターゲットのリンカステップで使用するオプションを指定するためのプロパティです。これは、共有ライブラリ、モジュールライブラリ、実行可能ファイルターゲット、およびデバイスリンクステップに適用されます。

機能

「LINK_OPTIONS」プロパティは、以下の機能を提供します。

  • デバッグ情報や最適化レベルなどのリンカ設定を制御する
  • オプションのスコープを特定のソースファイルに限定する
  • オプションのスコープをターゲットとその依存関係に限定する
  • ターゲットのリンカステップにオプションを追加する

使用方法

「LINK_OPTIONS」プロパティは、以下の方法で使用できます。

  • ディレクトリプロパティ LINK_OPTIONS を設定する
  • target_link_optionsコマンドを使用して追加する
  • ターゲットの作成時に直接設定する

以下の例は、「mytarget」という名前のターゲットにリンカオプションを追加する方法を示しています。

add_executable(mytarget main.cpp)
target_link_options(mytarget "-L/usr/local/lib" "-Wl,-rpath,/usr/local/lib")

この例では、target_link_optionsコマンドを使用して、以下のリンカオプションを「mytarget」に追加しています。

  • -Wl,-rpath,/usr/local/lib: ランタイムライブラリの検索パスを /usr/local/lib に設定します。
  • -L/usr/local/lib: ライブラリ検索パスを /usr/local/lib に設定します。
  • オプションのスコープを制御するには、PUBLICPRIVATEINTERFACEなどの修飾子を使用できます。
  • 「LINK_OPTIONS」プロパティは、CMake 3.13以降で導入されました。


ターゲットの作成時に直接設定

cmake_minimum_required(VERSION 3.13)

project(myproject)

add_executable(mytarget main.cpp)

# ターゲットの作成時にLINK_OPTIONSプロパティを直接設定
target_link_options(mytarget "-L/usr/local/lib" "-Wl,-rpath,/usr/local/lib")

この例では、target_link_optionsコマンドを使用せずに、ターゲットの作成時に「LINK_OPTIONS」プロパティを直接設定しています。

target_link_optionsコマンドを使用して追加

cmake_minimum_required(VERSION 3.13)

project(myproject)

add_executable(mytarget main.cpp)

# target_link_optionsコマンドを使用してLINK_OPTIONSを追加
target_link_options(mytarget PUBLIC "-L/usr/local/lib" PRIVATE "-Wl,-rpath,/usr/local/lib")

この例では、target_link_optionsコマンドを使用して「LINK_OPTIONS」を追加しています。オプションのスコープを制御するために、PUBLICPRIVATEの修飾子を使用しています。

ディレクトリプロパティ LINK_OPTIONS を設定

cmake_minimum_required(VERSION 3.13)

project(myproject)

set(CMAKE_EXE_LINK_OPTIONS "-L/usr/local/lib" "-Wl,-rpath,/usr/local/lib")

add_executable(mytarget main.cpp)

この例では、ディレクトリプロパティ CMAKE_EXE_LINK_OPTIONS を設定して、すべてのターゲットにデフォルトのリンカオプションを適用しています。

オプションのスコープを特定のソースファイルに限定

cmake_minimum_required(VERSION 3.13)

project(myproject)

add_executable(mytarget main.cpp math.cpp)

# 特定のソースファイルにLINK_OPTIONSを適用
set_property(SOURCE main.cpp PROPERTY LINK_OPTIONS "-lm")

target_link_libraries(mytarget m)

この例では、set_propertyコマンドを使用して、main.cppソースファイルにのみ適用される「LINK_OPTIONS」を設定しています。

デバッグ情報や最適化レベルを制御

cmake_minimum_required(VERSION 3.13)

project(myproject)

add_executable(mytarget main.cpp)

# デバッグ情報の生成を有効にする
target_link_options(mytarget "-g")

# 最適化レベルをO2に設定
target_link_options(mytarget "-O2")

この例では、「LINK_OPTIONS」を使用して、デバッグ情報の生成と最適化レベルを制御しています。

  • CMakeの最新情報については、公式ドキュメントを参照することをお勧めします。
  • 実際のプロジェクトでは、より複雑な構成が必要になる場合があります。
  • 上記のコードはあくまで例であり、完全なものではありません。


ターゲットプロパティ

特定のターゲットにのみ適用したいオプションがある場合は、ターゲットプロパティを使用して設定できます。たとえば、デバッグ情報生成を有効にするには、以下のコマンドを使用できます。

target_compile_features(mytarget PRIVATE debug)

このコマンドは、「mytarget」ターゲットのコンパイルステップで -g オプションを自動的に追加します。

ディレクトリプロパティ

複数のターゲットに共通するオプションがある場合は、ディレクトリプロパティを使用して設定できます。たとえば、すべてのターゲットに -L/usr/local/lib オプションを適用するには、以下のコマンドを使用できます。

set(CMAKE_EXE_LINK_OPTIONS "-L/usr/local/lib")

このコマンドは、すべてのエグゼキュータブルターゲットに -L/usr/local/lib オプションをデフォルトで設定します。

target_link_libraries コマンド

ライブラリをリンクする場合は、target_link_librariesコマンドを使用して、ライブラリとそれに関連するリンカオプションを指定できます。たとえば、m ライブラリをリンクするには、以下のコマンドを使用できます。

target_link_libraries(mytarget m)

このコマンドは、m ライブラリに必要なリンカオプションを自動的に追加します。

ソースファイルプロパティ

特定のソースファイルにのみ適用したいオプションがある場合は、ソースファイルプロパティを使用して設定できます。たとえば、main.cpp ソースファイルにのみ -lm オプションを適用するには、以下のコマンドを使用できます。

set_property(SOURCE main.cpp PROPERTY LINK_OPTIONS "-lm")

このコマンドは、main.cpp ソースファイルのコンパイルステップで -lm オプションを自動的に追加します。

カスタムコマンド

上記の方法で解決できない場合は、カスタムコマンドを使用してオプションを指定できます。たとえば、以下のコマンドを使用して、-Wl,-rpath,/usr/local/lib オプションをすべてのターゲットに追加できます。

add_custom_command(TARGET mytarget PRE_LINK COMMAND ${CMAKE_LINK_PERFORMER} -Wl,-rpath,/usr/local/lib)

このコマンドは、mytarget ターゲットのリンクステップの前にカスタムコマンドを実行します。

選択の指針

どの方法を選択するかは、状況によって異なります。以下の点を考慮する必要があります。

  • 複雑性: カスタムコマンドを使用する場合は、他の方法よりも複雑になる可能性があります。
  • オプションの種類: コンパイルオプションなのか、リンカオプションなのか、ライブラリなのか。
  • オプションの適用範囲: ターゲット固有なのか、複数のターゲットに共通なのか、特定のソースファイルにのみ適用したいのか。
  • CMakeの最新情報については、公式ドキュメントを参照することをお勧めします。
  • 実際のプロジェクトでは、より複雑な構成が必要になる場合があります。
  • 上記の方法はあくまで例であり、完全なものではありません。