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 以前のバージョンで使用できます。