{
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
}