CMake 3.3 から必須! ポリシー CMP0060 でライブラリリンクの安全性アップ
CMakeポリシー CMP0060は、CMake 3.3 で導入されたもので、ライブラリのリンク方法に影響を与えます。このポリシーは、暗黙的なリンクディレクトリにあるライブラリであっても、完全なパスを使用してリンクすることを目的としています。
背景
CMake 3.26.4 以前では、target_link_libraries()
コマンドに完全なパスでライブラリを指定した場合でも、暗黙的なリンクディレクトリにあるライブラリは ファイル名のみ で検索されていました。これは、意図しないライブラリへのリンクや、異なるバージョンのライブラリへのリンクなどの問題を引き起こす可能性がありました。
変更点
CMP0060 を有効にすると、CMake は すべてのライブラリを完全なパスでリンクします。これにより、一貫性と信頼性が向上し、予期せぬ動作のリスクが軽減されます。
互換性
既存のプロジェクトでは、この変更により問題が発生する可能性があります。CMake は、IMPORTED_LOCATION
プロパティを使用して 個別ライブラリのリンクパスを指定することで、この問題を回避する方法を提供しています。
使用方法
CMP0060 をプロジェクトで有効にするには、次のCMakeコマンドを使用します。
cmake_minimum_required(VERSION 3.3)
cmake_policy(SET CMP0060 NEW)
例
cmake_minimum_required(VERSION 3.3)
cmake_policy(SET CMP0060 NEW)
project(myproject)
add_executable(myprogram main.cpp)
target_link_libraries(myprogram mylib)
# mylib は暗黙的なリンクディレクトリにあると仮定します
set_target_properties(mylib PROPERTIES IMPORTED_LOCATION "/path/to/mylib.so")
この例では、mylib
ライブラリは暗黙的なリンクディレクトリにあると仮定されています。IMPORTED_LOCATION
プロパティを使用して、CMake にライブラリの 完全なパス を指定することで、この問題を回避しています。
cmake_minimum_required(VERSION 3.3)
cmake_policy(SET CMP0060 NEW)
project(myproject)
add_executable(myprogram main.cpp)
target_link_libraries(myprogram /path/to/mylib.so)
この例では、mylib
ライブラリは /path/to/mylib.so
という完全なパスで指定されています。
IMPORTED_LOCATION プロパティを使用して暗黙的なリンクディレクトリを指定する
cmake_minimum_required(VERSION 3.3)
cmake_policy(SET CMP0060 NEW)
project(myproject)
add_executable(myprogram main.cpp)
target_link_libraries(myprogram mylib)
# mylib は暗黙的なリンクディレクトリにあると仮定します
set_target_properties(mylib PROPERTIES IMPORTED_LOCATION "/path/to/mylib.so")
この例では、mylib
ライブラリは暗黙的なリンクディレクトリにあると仮定されています。IMPORTED_LOCATION
プロパティを使用して、CMake にライブラリの 完全なパス を指定することで、この問題を回避しています。
サブディレクトリにあるライブラリをリンクする
cmake_minimum_required(VERSION 3.3)
cmake_policy(SET CMP0060 NEW)
project(myproject)
add_executable(myprogram main.cpp)
target_link_libraries(myprogram ../subdirectory/mylib.so)
この例では、mylib
ライブラリは subdirectory
というサブディレクトリにあります。完全なパスは ../subdirectory/mylib.so
となります。
環境変数を使用してライブラリのパスを指定する
cmake_minimum_required(VERSION 3.3)
cmake_policy(SET CMP0060 NEW)
project(myproject)
add_executable(myprogram main.cpp)
target_link_libraries(myprogram $MYLIB_DIR/mylib.so)
set(MYLIB_DIR "/path/to/mylibs")
この例では、mylib
ライブラリのパスは MYLIB_DIR
という環境変数で指定されています。set
コマンドを使用して、この変数に値を割り当てています。
CMakeLists.txt 以外の場所からライブラリをリンクする
# CMakeLists.txt
cmake_minimum_required(VERSION 3.3)
cmake_policy(SET CMP0060 NEW)
project(myproject)
add_executable(myprogram main.cpp)
# 外部ライブラリファイルへのパスを指定
target_link_libraries(myprogram "/path/to/external/mylib.so")
# external/CMakeLists.txt
project(mylib)
add_library(mylib MYLIB_SOURCES)
target_link_libraries(mylib PUBLIC otherlib)
install(TARGETS mylib DESTINATION lib)
この例では、mylib
ライブラリは external
というディレクトリにあり、独自の CMakeLists.txt
ファイルを持っています。target_link_libraries
コマンドを使用して、myprogram
ターゲットに mylib
ライブラリをリンクします。
CMake ポリシー CMP0060 は、CMake 3.3 で導入されたもので、ライブラリのリンク方法に影響を与えます。このポリシーは、暗黙的なリンクディレクトリにあるライブラリであっても、完全なパスを使用してリンクすることを目的としています。
代替方法
CMP0060 ポリシーを使用しない場合は、以下の方法でライブラリをリンクできます。
ライブラリの完全なパスを指定する
target_link_libraries(myprogram /path/to/mylib.so)
IMPORTED_LOCATION プロパティを使用して暗黙的なリンクディレクトリを指定する
set_target_properties(mylib PROPERTIES IMPORTED_LOCATION "/path/to/mylib.so")
target_link_libraries(myprogram mylib)
この例では、mylib
ライブラリは暗黙的なリンクディレクトリにあると仮定されています。IMPORTED_LOCATION
プロパティを使用して、CMake にライブラリの 完全なパス を指定することで、この問題を回避しています。
サブディレクトリにあるライブラリをリンクする
target_link_libraries(myprogram ../subdirectory/mylib.so)
環境変数を使用してライブラリのパスを指定する
set(MYLIB_DIR "/path/to/mylibs")
target_link_libraries(myprogram $MYLIB_DIR/mylib.so)
CMakeLists.txt 以外の場所からライブラリをリンクする
# CMakeLists.txt (メインプロジェクト)
target_link_libraries(myprogram mylib)
# external/CMakeLists.txt (外部ライブラリ)
add_library(mylib MYLIB_SOURCES)
target_link_libraries(mylib PUBLIC otherlib)
install(TARGETS mylib DESTINATION lib)
- どの方法を使用するかは、プロジェクトの要件によって異なります。
- CMP0060 ポリシーを使用する場合は、これらの方法は必要ありません。
- 上記の方法は、CMake 3.26.4 以前のバージョンで使用できます。