CMakeでOpenGLライブラリを見つける:CMP0072ポリシーと代替方法


CMakeポリシー CMP0072 は、CMake が OpenGL ライブラリを見つける方法を制御します。このポリシーは CMake 3.11 で導入され、OpenGL ライブラリを見つける際に GLVND (GL Vendor Neutral Directory) を優先するように CMake の動作を変更しました。

影響

このポリシーが設定されていない場合、CMake は古い動作で OpenGL ライブラリを検索します。これは、システムに GLVND がインストールされている場合でも、古い OpenGL ライブラリを使用する可能性があることを意味します。

解決策

この問題を解決するには、以下のいずれかの方法で CMP0072 ポリシーを設定する必要があります。

CMake コマンドラインで設定

cmake -DCMAKE_POLICY_CMP0072=NEW

CMakeLists.txt ファイルで設定

cmake_minimum_required(VERSION 3.11)

cmake_policy(SET CMP0072 NEW)

OpenGL_GL_PREFERENCE 変数

さらに、OpenGL_GL_PREFERENCE 変数を使用して、OpenGL ライブラリの特定のバージョンを優先することができます。この変数は、以下のいずれかの値に設定できます。

  • AUTO: CMake がシステムに最適な OpenGL ライブラリを選択します。
  • NEW: GLVND を優先します。
  • LEGACY: 古い OpenGL ライブラリを優先します。
cmake_minimum_required(VERSION 3.11)

cmake_policy(SET CMP0072 NEW)
set(OpenGL_GL_PREFERENCE LEGACY)


CMake コマンドラインで設定する場合

cmake -DCMAKE_POLICY_CMP0072=NEW \
      <source_directory>

このコマンドは、source_directory ディレクトリにある CMakeLists.txt ファイルを使用してプロジェクトをビルドします。 -DCMAKE_POLICY_CMP0072=NEW オプションは、CMP0072 ポリシーを "NEW" に設定します。

CMakeLists.txt ファイルで設定する場合

cmake_minimum_required(VERSION 3.11)

cmake_policy(SET CMP0072 NEW)

project(MyProject)

add_executable(my_program main.cpp)

target_link_libraries(my_program OpenGL)

この例では、CMakeLists.txt ファイルで CMP0072 ポリシーを "NEW" に設定しています。その後、MyProject という名前のプロジェクトが作成され、main.cpp ファイルから my_program という名前の実行可能ファイルが作成されます。最後に、OpenGL ライブラリが my_program にリンクされます。

OpenGL_GL_PREFERENCE 変数を使用する場合

cmake_minimum_required(VERSION 3.11)

cmake_policy(SET CMP0072 NEW)
set(OpenGL_GL_PREFERENCE LEGACY)

project(MyProject)

add_executable(my_program main.cpp)

target_link_libraries(my_program OpenGL)

この例は、上記の例と同じですが、OpenGL_GL_PREFERENCE 変数を使用して古い OpenGL ライブラリを優先するように設定しています。

  • GLVND と OpenGL ライブラリについて詳しくは、関連するドキュメントを参照してください。
  • CMake の最新バージョンを使用していることを確認してください。古いバージョンの CMake では、CMP0072 ポリシーがサポートされていない場合があります。
  • 上記の例は、単純なプロジェクトの例です。実際のプロジェクトでは、より複雑な設定が必要になる場合があります。


CMP0072 ポリシーの代替方法はいくつかあります。

FindOpenGL モジュールを直接使用する

FindOpenGL モジュールは、OpenGL ライブラリを手動で検索するために使用できます。このモジュールは、以下のコマンドを使用して呼び出すことができます。

find_package(OpenGL REQUIRED)

このコマンドは、OpenGL_INCLUDE_DIROpenGL_LIBRARIES などの変数を設定します。これらの変数は、OpenGL ライブラリをビルドプロジェクトにリンクするために使用できます。

CMake の target_link_libraries コマンドを使用する

target_link_libraries コマンドを使用して、OpenGL ライブラリを手動でリンクすることもできます。このコマンドは、以下の構文で使用できます。

target_link_libraries(target_name OpenGL::OpenGL)

このコマンドは、target_name という名前のターゲットに OpenGL ライブラリをリンクします。

外部ビルドシステムを使用する

CMake 以外の外部ビルドシステムを使用してプロジェクトをビルドすることもできます。Make、Autotools、Meson などのツールは、OpenGL ライブラリを手動で検索してリンクすることができます。

各代替案の比較

方法利点欠点
FindOpenGL モジュールを使用するシンプルで使いやすいCMake に依存している
CMake の target_link_libraries コマンドを使用するより柔軟性が高い手動でライブラリを指定する必要がある
外部ビルドシステムを使用する最大限の柔軟性を提供する習得と使用がより複雑
  • 最大限の柔軟性を必要とする場合は、外部ビルドシステムを使用するのが良いでしょう。
  • より柔軟性が必要な場合は、CMake の target_link_libraries コマンドを使用するのが良いでしょう。
  • シンプルで使いやすい方法が必要な場合は、FindOpenGL モジュールを使用するのが良いでしょう。
  • GLVND と OpenGL ライブラリについて詳しくは、関連するドキュメントを参照してください。
  • CMake の最新バージョンを使用していることを確認してください。古いバージョンの CMake では、一部の代替方法がサポートされていない場合があります。
  • 上記の代替方法は、互いに排他的ではありません。組み合わせて使用することもできます。