Linux下OpenGL的安装与cmake编译OpenGL程序

{

OpenGL安装

安装命令如下:

$ sudo apt install build-essential
$ sudo apt install libgl1-mesa-dev
$ sudo apt install libglu1-mesa-dev
$ sudo apt install freeglut3 freeglut3-dev

    1
    2
    3
    4

cmake编译OpenGL程序

project
├── MeshLib
│   └── core
│        └── bmp
│             └── RgbImage.cpp
├── MyDemo
│   ├── main.cpp
│   ├── CMakeLists.txt
│   └── build


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

其他头文件的路径直接在.cpp里体现出来,如:
在main.cpp中:

  #include <GL/glut.h>
    #include "../MeshLib/core/viewer/Arcball.h"      
    #include "../MeshLib/core/bmp/RgbImage.h"
    #include "../MeshLib/core/Geometry/quat.h"

    1
    2
    3
    4

否则,如果直接写 #include “Arcball.h” 之类的,就需要在CMakeLists.txt中包含所有头文件路径(如glut.h就需要指定路径 OpenGL_INCLUDE_DIR)
若使用freeglut的话

MyDemo/CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
    add_compile_options(-std=c++11)
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/build/CMakeModules/")

    project(MyDemo)

    find_package(OpenGL REQUIRED)
    include_directories(${OpenGL_INCLUDE_DIR})

    find_package(FREEGLUT REQUIRED)
    include_directories(${FREEGLUT_INCLUDE_DIR})

    add_executable(${PROJECT_NAME} ${PROJECT_BINARY_DIR}/../../MeshLib/core/bmp/RgbImage.cpp main.cpp )

    target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARY} ${FREEGLUT_LIBRARY} ${OPENGL_LIBRARY})

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

但是光这样还是没办法的,因为找不到freeglut库,这时候需要再写一个搜索package frerglut的CMakeLitsts.txt
在build目录下mkdir一个CMakeModules, 新建一个文件名FindFREEGLUT.cmake的文件,编辑内容如下(为什么是在build目录下新建而不是在MyDemo目录下?因为我们是进入build中,执行命令”cmake ..“的)

# Try to find the FREEGLUT library
    #
    # FREEGLUT_INCLUDE_DIR
    # FREEGLUT_LIBRARY
    # FREEGLUT_FOUND

    FIND_PATH(
      FREEGLUT_INCLUDE_DIR GL/freeglut.h GL/gl.h GL/glu.h GL/glew.h
      ${CMAKE_INCLUDE_PATH}
      $ENV{include}
      ${OPENGL_INCLUDE_DIR}
      /usr/include
      /usr/local/include
    )

    SET(STORE_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
    SET(CMAKE_FIND_FRAMEWORK NEVER)

    FIND_LIBRARY(
      FREEGLUT_LIBRARY
      NAMES freeglut_static freeglut glut GL
      PATH
        /opt/local/lib
        ${CMAKE_LIBRARY_PATH}
        $ENV{lib}
        /usr/lib
        /usr/local/lib
    )

    SET(CMAKE_FIND_FRAMEWORK ${STORE_CMAKE_FIND_FRAMEWORK})

    IF (FREEGLUT_INCLUDE_DIR AND FREEGLUT_LIBRARY)
       SET(FREEGLUT_FOUND TRUE)
    ENDIF (FREEGLUT_INCLUDE_DIR AND FREEGLUT_LIBRARY)

    IF (FREEGLUT_FOUND)
       IF (NOT FREEGLUT_FIND_QUIETLY)
          MESSAGE(STATUS "Found FREEGLUT: ${FREEGLUT_LIBRARY}")
       ENDIF (NOT FREEGLUT_FIND_QUIETLY)
    ELSE (FREEGLUT_FOUND)
       IF (FREEGLUT_FIND_REQUIRED)
          MESSAGE(FATAL_ERROR "Could not find FREEGLUT")
       ENDIF (FREEGLUT_FIND_REQUIRED)
    ENDIF (FREEGLUT_FOUND)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44

若使用glut的话

则则比较简单:

cmake_minimum_required (VERSION 2.6)  

    project(OpenGL)  

    find_package(OpenGL REQUIRED)  
    include_directories(${OPENGL_INCLUDE_DIR})  

    find_package(GLUT REQUIRED)  
    include_directories(${GLUT_INCLUDE_DIR})  

    set(CMAKE_CXX_FLAGS "-g -Wall")  

    add_executable(OpenGL Main.cpp)  
    target_link_libraries(OpenGL ${GLUT_LIBRARY} ${OPENGL_LIBRARY})

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

可能出现的错误

    if you use `-fpermissive’, G++ will accept your code, but allowing the use of an undeclared name is deprecated

    解决方法 add_compile_options(-fpermissive -std=c++11)

    undefined reference to symbol …
    这类错误通常是链接.so, .a文件失败产生的,但是都会给出具体是哪个lib没有:”/lib/x86_64-linux-gnu/libz.so: error adding symbols: DSO missing from command line”
    解决方法,
    1.用各种方法把libz.so放到指定目录下(方法太多了自行查询)
    2.若目录下已有libz.so,则在target_link_libraries中加上该libz.so( ${PROJECT_SOURCE_DIR}//libz.so)
————————————————
版权声明:本文为CSDN博主「SarKerson」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sarkerson/java/article/details/78068417

}

相关推荐