CMake声称找到了OpenGL,但无法找到EGL和OpenGL :: GL。

6

在Ubuntu上,当我试图查找OpenGL时,CMake给了我令人困惑的结果。

背景是,我需要在服务器/ docker上进行无头渲染,而不需要X显示。我通过apt-get install libgl1-mesa-devapt-get install libegl1-mesa-dev安装了OpenGL。

以下是我CMakeLists.txt中相关部分:

cmake_minimum_required (VERSION 3.5.1)
project (sandbox LANGUAGES CXX)

# add OpenGL

find_package(OpenGL REQUIRED COMPONENTS OpenGL EGL GLX)
include_directories(${OPENGL_INCLUDE_DIRS})
if(OPENGL_FOUND)
    message("Found OpenGL in the current environment!")
else()
    message("Error: No OpenGL found.")
endif()

message("OpenGL include dirs" )
message("${OPENGL_INCLUDE_DIR}")
message("EGL include dirs" )
message("${OPENGL_EGL_INCLUDE_DIRS}")

if (OpenGL_EGL_FOUND)
    message("EGL Found!")
else()
    message("EGL Not Found!")
endif()

add_executable (sandbox "hello_egl.cpp" "shader.cpp")

target_link_libraries(sandbox PRIVATE OpenGL::OpenGL OpenGL::EGL OpenGL::GLX)

#target_include_directories(sandbox PRIVATE "/usr/include/EGL")
#target_link_libraries(sandbox "/usr/local/lib/x86_64-linux-gnu/libEGL.so")
#target_link_libraries(sandbox "/usr/local/lib/libEGL.so")

set_target_properties(sandbox PROPERTIES CXX_STANDARD 11)

我运行cmake ..时出现以下错误:

Found OpenGL in the current environment!
OpenGL include dirs
/usr/local/include
EGL include dirs

EGL Not Found!

-- Configuring done
CMake Error at CMakeLists.txt:44 (add_executable):
  Target "sandbox" links to target "OpenGL::OpenGL" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?


CMake Error at CMakeLists.txt:44 (add_executable):
  Target "sandbox" links to target "OpenGL::EGL" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?


CMake Error at CMakeLists.txt:44 (add_executable):
  Target "sandbox" links to target "OpenGL::GLX" but the target was not
  found.  Perhaps a find_package() call is missing for an IMPORTED target, or
  an ALIAS target is missing?

很令人困惑的是,CMakeOPENGL_FOUND 设置为 true,但却无法链接到 OpenGL::OpenGL 目标?此外,我将 EGL 放在了 /usr/local/lib/x86_64-linux-gnu/ 中,为什么 CMake 找不到它呢?
root@6442439c7090:/app/sandbox/build# ls /usr/local/lib/x86_64-linux-gnu/
libEGL.so        libGL.so.1         libGLESv1_CM.so.1.2.0  libGLX.so         libGLdispatch.so.0      libOpenGL.so.0.0.0
libEGL.so.1      libGL.so.1.7.0     libGLESv2.so           libGLX.so.0       libGLdispatch.so.0.0.0  pkgconfig
libEGL.so.1.1.0  libGLESv1_CM.so    libGLESv2.so.2         libGLX.so.0.0.0   libOpenGL.so
libGL.so         libGLESv1_CM.so.1  libGLESv2.so.2.1.0     libGLdispatch.so  libOpenGL.so.0

我坚持使用find_package的原因是之前我手动链接到了libEGL.so,但是在运行时应用程序无法获取显示屏。因此,我怀疑我链接了错误的库。
terminate called after throwing an instance of 'std::runtime_error'
  what():  EGL error 0x300c at eglGetDisplay
Aborted (core dumped)

你可以尝试给出提示,告诉CMake在哪里找到EGL库:cmake -DOPENGL_egl_LIBRARY=/usr/local/lib/x86_64-linux-gnu/libEGL.so .. 另外,你是否阅读了CMake文档中关于这个包的“Linux-specific”讨论?链接 - Kevin
4
你使用的是哪个版本的CMake?在3.5版本中(根据cmake_minimum_required要求),FindOpenGL.cmake模块无法找到EGL库,也无法处理COMPONENTS部分。 - Tsyvarev
@Tsyvarev 是的,那就是问题所在。谢谢!我没有意识到有版本差异。 - yuqli
@squareskittles 感谢您的评论!这是一个有用的提示。我只是试图让CMake找到它,因为之前手动链接导致了不利的结果...我确实阅读了文档,但阅读了错误的版本... - yuqli
1个回答

3
根据@Tsyvarev的有益评论,这个输出是由于使用了错误版本的CMake。
我忘记链接了,但我查看的FindOpenGL文档是3.18.1版本的,而我需要的最小CMake版本是3.5.1。
在3.5.1中,没有“COMPONENTS”部分。此外,“OPENGL_FOUND”不会检查“EGL”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接