C++ 无法将传统GL库与cmake一起使用(ubuntu 18.04和20.04)

C++ 无法将传统GL库与cmake一起使用(ubuntu 18.04和20.04),c++,linux,opengl,cmake,C++,Linux,Opengl,Cmake,我有一个非常简单的CMakeLists.txt,在这里我使用OpenGL,我需要与传统的OpenGL链接。 策略说我需要将OpenGL\u GL\u首选项设置为LEGACY cmake_minimum_required(VERSION 3.10) project(Foo) set(OpenGL_GL_PREFERENCE LEGACY) find_package(OpenGL REQUIRED) set(SOURCES main.cpp) add_executable(foo

我有一个非常简单的CMakeLists.txt,在这里我使用OpenGL,我需要与传统的OpenGL链接。 策略说我需要将
OpenGL\u GL\u首选项设置为
LEGACY

cmake_minimum_required(VERSION 3.10)
project(Foo)

set(OpenGL_GL_PREFERENCE LEGACY)
find_package(OpenGL REQUIRED)

set(SOURCES
    main.cpp)

add_executable(foo
    ${SOURCES})

target_link_libraries(
    foo
    PUBLIC OpenGL::GLU
    )
但是,cmake输出为:

——C编译器标识是GNU 9.3.0
--CXX编译器标识为GNU 9.3.0
--检查C编译器是否工作:/usr/bin/cc
--检查C编译器是否工作:/usr/bin/cc--works
--检测C编译器ABI信息
--检测C编译器ABI信息-完成
--检测C编译特性
--检测C编译特性-完成
--检查CXX编译器是否工作:/usr/bin/c++
--检查CXX编译器是否正常工作:/usr/bin/c++--正常工作
--检测CXX编译器ABI信息
--检测CXX编译器ABI信息-完成
--检测CXX编译特性
--检测CXX编译功能-完成
--找到OpenGL:/usr/lib/x86_64-linux-gnu/libOpenGL.so
--配置完成
--生成完成
--生成文件已写入:/home/alesandro/tmp/foo/Build
它正在链接
libOpenGL.so
,而不是
libGL.so

此外,如果我对行
集(OpenGL\u GL\u PREFERENCE LEGACY)
进行注释,我会得到以下输出:

——C编译器标识是GNU 9.3.0
--CXX编译器标识为GNU 9.3.0
--检查C编译器是否工作:/usr/bin/cc
--检查C编译器是否工作:/usr/bin/cc--works
--检测C编译器ABI信息
--检测C编译器ABI信息-完成
--检测C编译特性
--检测C编译特性-完成
--检查CXX编译器是否工作:/usr/bin/c++
--检查CXX编译器是否正常工作:/usr/bin/c++--正常工作
--检测CXX编译器ABI信息
--检测CXX编译器ABI信息-完成
--检测CXX编译特性
--检测CXX编译功能-完成
CMake警告(dev)位于/usr/share/CMake-3.16/Modules/FindOpenGL.CMake:275(消息):
未设置策略CMP0072:当
可用。运行“cmake--帮助策略CMP0072”获取策略详细信息。使用
cmake_policy命令设置策略并抑制此警告。
FindOpenGL找到了一个旧GL库:
OPENGL\u gl\u库:/usr/lib/x86\u 64-linux-gnu/libGL.so
以及用于OpenGL和GLX的GLVND库:
OPENGL_OPENGL_库:/usr/lib/x86_64-linux-gnu/libOpenGL.so
OPENGL_glx_库:/usr/lib/x86_64-linux-gnu/libGLX.so
OpenGL_首选项尚未设置为“GLVND”或“LEGACY”,因此
将使用与CMake 3.10及以下版本兼容的传统GL库。
调用堆栈(最新调用优先):
CMakeLists.txt:6(查找包)
此警告适用于项目开发人员。使用-Wno-dev来抑制它。
--找到OpenGL:/usr/lib/x86_64-linux-gnu/libOpenGL.so
--配置完成
--生成完成
--生成文件已写入:/home/alesandro/tmp/foo/Build
这很让人困惑:它首先说默认情况下更喜欢使用
GLVND
,但是

为了与CMake 3.10及以下版本兼容,将使用传统GL库

在任何情况下,都会安装
libGL.so
libOpenGL.so
,并设置
libOpenGL.so

我不知道问题出在哪里,我如何才能强制cmake使用遗留GL而不是GLVND


运行Ubuntu20.04,但在Ubuntu18.04中的行为也是一样的。

第一个变体似乎应该可以工作,但这种情况下的CMake输出令人困惑:CMake已经找到了OpenGL的两个流,但第一个实例是
OpenGL\u OpenGL\u库
,因此,它被打印在
--Found OpenGL:/usr/lib/x86_64-linux-gnu/libOpenGL.so
中。您应该能够使用variable
OPENGL\u gl\u LIBRARY
或target
OPENGL::gl
来访问传统的OPENGL。很可能,将
列表(附加
REQUIRED\u VARS OPENGL\u gl\u LIBRARY)
替换为
列表(PREPEND\u OPENGL\u REQUIRED\u VARS OPENGL\u gl\u LIBRARY)
可以修复这一令人困惑的输出。谢谢@Tsyvarev。因此,如果我理解正确,有两个目标:
OpenGL::GL
OpenGL::OpenGL
。因此,
OpenGL::OpenGL
无论如何都是GLVND,
OpenGL::GL
可以是遗留的还是GLVND,这取决于策略?而
找到OpenGL:
打印它与这两个目标无关吗?这非常令人困惑,也没有很好的文档记录。
OpenGL::OpenGL
OpenGL::GL
中描述了目标。至于
Found XXX:…
output的内容,我没有看到任何模块(无论是CMake附带的模块还是externals模块)记录该输出。