C++ 无法将传统GL库与cmake一起使用(ubuntu 18.04和20.04)
我有一个非常简单的CMakeLists.txt,在这里我使用OpenGL,我需要与传统的OpenGL链接。 策略说我需要将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
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
中。您应该能够使用variableOPENGL\u gl\u LIBRARY
或targetOPENGL::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模块)记录该输出。