如何使用 CMake 在 Ubuntu 中查找和 link OpenGL(mesa) 包
How to use CMake to find and link OpenGL(mesa) package in Ubuntu
我对 CMake 和 OpenGL 完全陌生。我现在需要在我的 Ubuntu 15.04 64 位 PC 上的项目中使用 OpenGL 作为库,它由 CMake 3.0.2[=68= 构建].
这几天我一直在努力,几乎感到沮丧。我被一堆问题弄糊涂了。
台面和 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文件中link静态库和共享库,第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 路径,不幸的是,列出的路径中存在 none。
我是否正确安装了mesa?
使用 CMake FindOpenGL,参见 https://cmake.org/cmake/help/v3.0/module/FindOpenGL.html。
第 17 行和第 23 行之间的区别在于您查找库(第 17 行中的 find_library)和 headers(第 23 行中的find_path ).在第 23 行和第 29 行中,您在两个不同的位置查找 gl.h。总的来说,这并不重要,因为您应该编写自己的查找例程,因为 CMake 为您提供了一个例程。
您可以找到静态库和共享库。默认情况下,您会得到 .so。一秒钟 运行 / 来自 https://cmake.org/pipermail/cmake/2010-December/041326.html
的变量 "Just ask for the archive name first: find_library(MYLIB NAMES libmylib.a mylib)
"
问题 3 可以通过提示 CMake 在哪里查看来解决。这可以通过将正确的路径添加到 CMAKE_PREFIX_PATH 来完成。在您的情况下,如果您使用 CMake 中的 FindOpenGL,应该可以找到它。
如前所述,使用cmake提供的built-in 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
我对 CMake 和 OpenGL 完全陌生。我现在需要在我的 Ubuntu 15.04 64 位 PC 上的项目中使用 OpenGL 作为库,它由 CMake 3.0.2[=68= 构建].
这几天我一直在努力,几乎感到沮丧。我被一堆问题弄糊涂了。
台面和 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文件中link静态库和共享库,第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 路径,不幸的是,列出的路径中存在 none。
我是否正确安装了mesa?
使用 CMake FindOpenGL,参见 https://cmake.org/cmake/help/v3.0/module/FindOpenGL.html。
第 17 行和第 23 行之间的区别在于您查找库(第 17 行中的 find_library)和 headers(第 23 行中的find_path ).在第 23 行和第 29 行中,您在两个不同的位置查找 gl.h。总的来说,这并不重要,因为您应该编写自己的查找例程,因为 CMake 为您提供了一个例程。
您可以找到静态库和共享库。默认情况下,您会得到 .so。一秒钟 运行 / 来自 https://cmake.org/pipermail/cmake/2010-December/041326.html
的变量 "Just ask for the archive name first: 问题 3 可以通过提示 CMake 在哪里查看来解决。这可以通过将正确的路径添加到 CMAKE_PREFIX_PATH 来完成。在您的情况下,如果您使用 CMake 中的 FindOpenGL,应该可以找到它。
find_library(MYLIB NAMES libmylib.a mylib)
"
如前所述,使用cmake提供的built-in 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