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})
このコードは、foo
と bar
の両方のライブラリを 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
ターゲットに foo
と bar
ライブラリをリンクします。
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)
この例では、foo
と bar
ライブラリを定義し、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
コマンドを使用する方法は、より柔軟なライブラリリンクの設定が可能になります。 - シンプルさ: ターゲットプロパティを使用する方法は、最もシンプルで分かりやすい方法です。