【问题标题】:How to use CMake to find and link OpenGL(mesa) package in Ubuntu如何使用 CMake 在 Ubuntu 中查找和链接 OpenGL(mesa) 包
【发布时间】:2016-03-04 06:56:27
【问题描述】:

我是 CMakeOpenGL 的新手。我现在需要在我的 Ubuntu 15.04 64 位 PC 上的项目中使用 OpenGL 作为库,该 PC 由 CMake 3.0.2 构建。

我已经为此工作了几天,几乎感到沮丧。我对一堆问题感到困惑。


台面和 OpenGL

首先,我使用命令sudo apt-get install mesa-common-dev 安装了mesa 包,得到了mesa 10.5.2

然后我用dpkg -L mesa-common-dev浏览包文件:

/.
/usr
/usr/share
/usr/share/bug
...
/usr/share/bug/mesa-common-dev/control

/usr/share/doc
...
/usr/share/doc/mesa-common-dev/faq.html

/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/pkgconfig
/usr/lib/x86_64-linux-gnu/pkgconfig/dri.pc

/usr/include
/usr/include/GL
/usr/include/GL/gl.h
...
/usr/include/GL/glx_mangle.h

问题 1:共享库 (.so) 和静态库 (.a) 在哪里?


CMake

我现在有一个CMakeLists.txt,带有名为OPENGL 的OpenGL 模块

...
find_package(OPENGL REQUIRED)  # here is CMakeLists.txt:45
...
include_directories(${OPENGL_INCLUDE_DIRS})
link_directories(${OPENGL_LIBRARY_DIRS})
target_link_libraries(MyProj ... ${OPENGL_LIBRARIES})
...

所以我肯定需要一个cmake文件,比如FindOPENGL.cmake,像这样(以GLEW的cmake文件为模板):

# OPENGL_FOUND             If OPENGL is found
# OPENGL_LIBRARIES         OPENGL libraries
# OPENGL_INCLUDE_DIRS      OPENGL include directories
# OPENGL_LIBRARY_DIRS      OPENGL library directories

if(UNIX)
  set(OPENGL_INC_NAMES gl.h)
  set(OPENGL_LIB_NAMES libGL.so.1.2.0)
endif(UNIX)

# OPENGL static library     # line 17
find_library(OPENGL_LIBRARIES
    NAMES ${OPENGL_LIB_NAMES}
    PATHS /usr/x86_64-linux-gnu/mesa
    DOC "OPENGL library")

# OPENGL library dir        # line 23
find_path(OPENGL_LIBRARY_DIRS
    NAMES ${OPENGL_LIB_NAMES}
    PATHS /usr/x86_64-linux-gnu/mesa
    DOC "OPENGL include directories")

# OPENGL include dir        # line 29
find_path(OPENGL_INCLUDE_DIRS
    NAMES ${OPENGL_INC_NAMES}
    PATHS /usr/include/GL
    DOC "OPENGL include directories")

# Version
set(OPENGL_VERSION 1.13.0)

# Set package standard args
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(OPENGL       # here is FindOPENGL.cmake:40
    REQUIRED_VARS OPENGL_LIBRARIES OPENGL_INCLUDE_DIRS OPENGL_LIBRARY_DIRS
    VERSION_VAR OPENGL_VERSION)

问题2:如何在cmake文件中链接静态库和共享库,第17/23/29行有什么区别?

然后我运行 cmake 并得到以下错误:

CMake Error at /usr/share/cmake-3.0/Modules/FindPackageHandleStandardArgs.cmake:136 (message):
  Cound NOT find OPENGL (missing: OPENGL_LIBRARIES OPENGL_LIBRARY_DIRS)
  (found version "1.13.0")
Call Stack (most recent call first):
  /usr/share/cmake-3.0/Modules/FindPackageHandleStandardArgs.cmake:343 (_FPHSA_FAILURE_MESSAGE)
  cmake/modules/FindOPENGL.cmake:40 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:45 (find_package)

问题 3:我怎么会收到这个错误,我该如何解决?在整个过程中我做错了什么吗?


更新

感谢@usr1234567 的回答,然后我删除我的FindOPENGL.cmake 并尝试使用/usr/share/cmake-3.0/Modules/FindOpenGL.cmake。我仍然收到错误missing: OPENGL_gl_LIBRARY。我查看了这个 cmake 文件以了解 OPENGL_gl_LIBRARY 的定义,并手动检查其中的 lib 路径,不幸的是,列出的路径都不存在。

我是否正确安装了台面?

【问题讨论】:

  • 尝试安装 freeglut3-dev,它应该会拉取所有需要的 OpenGL 依赖包。
  • @usr1234567 我必须使用一些其他库来替代freeglut3,无论如何,你的评论给了我很多启发,问题是我没有得到所有必需的包。
  • @usr1234567 不幸的是发生了其他链接错误...
  • 所以 CMake 不再发出您在问题中的警告?然后接受我的回答,也许可以发布一个新的。当前的问题已经很具体了,对很多其他人没有帮助。
  • 安装所有这些软件包后,我可以使用 cmake 正确生成 Makefile:mesa-common-dev mesa-utils-extra libgl1-mesa-dev libglu1-mesa-dev libglapi-mesa libx11-dev libxi -dev libxinerama-dev libxcursor-dev libxrandr-dev

标签: opengl cmake mesa


【解决方案1】:
  • 使用 CMake FindOpenGL,参见 https://cmake.org/cmake/help/v3.0/module/FindOpenGL.html

  • 第 17 行和第 23 行之间的区别在于您查找库(第 17 行中的 find_library)和标题(第 23 行中的 find_path)。在第 23 和 29 行中,您在两个不同的位置查找 gl.h。总的来说,这并不重要,因为您应该编写自己的查找例程,因为 CMake 为您提供了一个。

  • 您可以找到静态库和共享库。默认情况下,您将获得 .so。对于第二次运行/变量“请先询问存档名称:find_library(MYLIB NAMES libmylib.a mylib)”来自https://cmake.org/pipermail/cmake/2010-December/041326.html

  • 可以通过提示 CMake 查找位置来解决问题 3。这可以通过将正确的路径添加到 CMAKE_PREFIX_PATH 来完成。在您的情况下,如果您使用 CMake 中的 FindOpenGL,应该可以找到它。

【讨论】:

  • 感谢您的回答。对了,find_path是针对.h的,find_library是针对.a的,cmake如何处理共享库.so
  • 然后我使用 CMake 中的FindOpenGL.cmake,仍然有错误missing: OpenGL_gl_LIBRARY,我在CMakeLists.txt 中打印OPENGL_FOUND OPENGL_XMESA_FOUND OPENGL_GLU_FOUND OPENGL_INCLUDE_DIR OPENGL_LIBRARIES OPENGL_gl_LIBRARY,除了OPENGL_FOUND=FALSE 之外没有定义这些变量。如何正确使用OpenGL?
【解决方案2】:

如上所述,使用cmake提供的内置FindOpenGL.cmake

你错过了libgl1-mesa-dev。所以试试这个:

sudo apt install mesa-common-dev libgl1-mesa-dev

如果您希望 FindOpenGL.cmake 找到 EGL,则可以选择:

sudo apt install mesa-common-dev libgl1-mesa-dev libgles2-mesa-dev

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 2021-05-25
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多