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_DIR
と OpenGL_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 では、一部の代替方法がサポートされていない場合があります。
- 上記の代替方法は、互いに排他的ではありません。組み合わせて使用することもできます。