CMake: CMAKE_LANG_LINK_LIBRARY_FLAG変数でライブラリをプログラムにリンクする方法


CMAKE_LANG_LINK_LIBRARY_FLAG は、CMake の Variables における重要な変数の一つであり、特定の言語でコンパイルされたプログラムにリンクするライブラリを指定するために使用されます。この変数は、コンパイラがライブラリを検索し、プログラムに正しくリンクできるようにするために必要です。

構文

CMAKE_LANG_LINK_LIBRARY_FLAG_<LANG> = <flag>
  • <flag> は、コンパイラがライブラリを検索するために使用するフラグです。これは、オペレーティングシステムやコンパイラによって異なる場合があります。
  • <LANG> は、C、C++、Fortran などのプログラミング言語を表す文字列です。

C++ でコンパイルされたプログラムにライブラリ foo をリンクするには、次のコードを使用します。

CMAKE_LANG_LINK_LIBRARY_FLAG_CXX = -lfoo

このコードは、コンパイラに foo ライブラリを検索するように指示します。ライブラリが libfoo.so または libfoo.a のような名前の場合、コンパイラはこれらのファイルを探します。

  • 複数のライブラリをリンクする場合は、スペースで区切ってフラグを列挙できます。
  • CMAKE_LANG_LINK_LIBRARY_FLAG 変数は、ターゲット固有のスコープを持つことに注意してください。つまり、この変数は特定のターゲットに対してのみ設定できます。
CMAKE_LANG_LINK_LIBRARY_FLAG_CXX = -lfoo -lbar
  • ライブラリのパスを指定する場合は、-L フラグを使用できます。
CMAKE_LANG_LINK_LIBRARY_FLAG_CXX = -L/path/to/libraries -lfoo
  • それぞれのオペレーティングシステムやコンパイラにおけるライブラリフラグの詳細については、それぞれのドキュメントを参照してください。


cmake_minimum_required(VERSION 3.10)

project(myproject)

set(SOURCE_FILES main.cpp)
set(TARGET_LINK_LIBRARIES foo)

add_executable(myprogram ${SOURCE_FILES})

このコードは、foo ライブラリを C++ プログラム myprogram にリンクします。

例 2: 複数のライブラリをリンクする

cmake_minimum_required(VERSION 3.10)

project(myproject)

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

add_executable(myprogram ${SOURCE_FILES})

このコードは、foobar の両方のライブラリを C++ プログラム myprogram にリンクします。

例 3: ライブラリのパスを指定する

cmake_minimum_required(VERSION 3.10)

project(myproject)

set(SOURCE_FILES main.cpp)
set(TARGET_LINK_LIBRARIES foo)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} /path/to/module)

find_package(Foo REQUIRED)

add_executable(myprogram ${SOURCE_FILES})

このコードは、foo ライブラリを C++ プログラム myprogram にリンクします。ライブラリは /path/to/libraries ディレクトリにあると仮定します。

例 4: ターゲット固有のスコープ

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(myprogram1 main1.cpp)
add_executable(myprogram2 main2.cpp)

target_link_libraries(myprogram1 foo)
target_link_libraries(myprogram2 bar)

このコードは、foo ライブラリを myprogram1 にリンクし、bar ライブラリを myprogram2 にリンクします。

説明

上記の例は、CMAKE_LANG_LINK_LIBRARY_FLAG 変数の使用方法をいくつか示しています。これらの例は、C++ プログラムを対象としていますが、他の言語でも同様の方法で変数を使用できます。

  • CMake のバージョンやオペレーティングシステムによって、構文や動作が異なる場合があります。
  • 上記の例はあくまでもサンプルであり、実際のプロジェクトで使用するには調整が必要となる場合があります。


代替方法

以下に、CMAKE_LANG_LINK_LIBRARY_FLAG 変数の代替方法をいくつか紹介します。

ターゲットプロパティを使用する

ターゲットプロパティを使用することで、より柔軟かつ詳細なライブラリリンクの設定が可能になります。

target_link_libraries(mytarget foo bar)

この例では、mytarget ターゲットに foobar ライブラリをリンクします。

add_library コマンドを使用する

add_library コマンドを使用すると、ライブラリとその依存関係を定義できます。その後、target_link_libraries コマンドを使用して、ターゲットにライブラリをリンクできます。

add_library(foo foo.cpp foo.h)
add_library(bar bar.cpp bar.h)

target_link_libraries(mytarget foo bar)

この例では、foobar ライブラリを定義し、mytarget ターゲットにリンクします。

外部プロジェクトを使用する

外部プロジェクトを使用することで、他の CMake プロジェクトからライブラリをリンクすることができます。

externalproject_add(foo
    SOURCE_DIR /path/to/foo
    BUILD_COMMAND ${CMAKE_COMMAND} -H. -Bbuild
    INSTALL_COMMAND ${CMAKE_COMMAND} -P install.cmake
)

target_link_libraries(mytarget foo)

この例では、/path/to/foo ディレクトリにある foo プロジェクトを外部プロジェクトとして追加し、mytarget ターゲットにリンクします。

Find_Package モジュールを使用する

Find_Package モジュールを使用すると、特定のライブラリを自動的に検出することができます。

find_package(Foo REQUIRED)

target_link_libraries(mytarget Foo::LIBRARIES)

この例では、Foo ライブラリを自動的に検出し、mytarget ターゲットにリンクします。

選択の指針

どの代替方法を使用するかは、状況によって異なります。

  • 自動化: Find_Package モジュールを使用する方法は、特定のライブラリを自動的に検出したい場合に有効です。
  • 再利用性: 外部プロジェクトを使用する方法は、他の CMake プロジェクトでライブラリを再利用する場合に有効です。
  • 柔軟性: add_library コマンドを使用する方法は、より柔軟なライブラリリンクの設定が可能になります。
  • シンプルさ: ターゲットプロパティを使用する方法は、最もシンプルで分かりやすい方法です。