如何使用CMake在Ubuntu中查找和链接O​​penGL(mesa)包

时间:2015-11-30 15:24:27

标签: opengl cmake mesa

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

我这几天一直在努力,几乎感到沮丧。我对一堆问题感到困惑。

mesa和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路径,遗憾的是,没有列出的路径存在。

我是否正确安装了mesa?

2 个答案:

答案 0 :(得分:2)

  • 使用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

  • 问题3可以通过暗示CMake在哪里寻找来解决。这可以通过向CMAKE_PREFIX_PATH添加正确的路径来完成。在您的情况下,如果您使用CMake的FindOpenGL,则应该找到它。

答案 1 :(得分:1)

如前所述,请使用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