教程中使用的环境是Visual Studios + CMake + MSVC,我没用过也没安装过Visual Studio。所以我选择的环境是vscode + CMake + MinGW-w64,在linux直接gcc就行了,mac用gcc、clang都可以。这样的好处是在win、linux、mac上都能搭建这套环境。
工具安装
我的系统是win,因为要打游戏(
- vscode 就不多说了,用其他编辑器/IDE也行
mingw-w64
编译器肯定是必须的,我没用过msvc,只用过gcc,mingw-w64就是win上的gcc。
-
双击打开,选择native windows,x86_64,如果是32位系统则选i686。设置好安装目录
-
直接点process安装
-
完成后,安装目录的bin文件夹里就有gcc了
-
最后吧bin目录添加到系统环境变量PATH里:此电脑-属性-高级系统设置-环境变量-PATH-添加
D:\app\mingw-w64\bin
cmake
c++在编译的时候,需要引用各种头文件,链接这个那个的各种动态库、静态库。项目复杂的时候编译会很麻烦,cmake相当于一个构建系统,用不怎么简洁的语法,描述如何编译目标,帮我们生成makefile文件,自动编译项目。
-
下载地址:cmake.org/download/,选择
.msi
安装 -
一路点next,安装路径无所谓,记得加入PATH就行
-
完事检查下安装成功
依赖库安装
需要用到以下库:
- GLFW - 负责创建OpenGL上下文并显示窗口
- GLAD - 查找openGL函数指针
GLFW
在画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL有目的地从这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义OpenGL上下文以及处理用户输入。
-
解压后进入目录
-
在此目录执行
cmake -S . -B build -G "MinGW Makefiles" -DBUILD_SHARED_LIBS=ON
,其中
-S
指定源码所在目录,
-B
指定构建/输出目录,
-G
指定我们是给MinGW生产makefile,最后一个参数是告诉CMake,我们要动态库
-
最后,进入
build/
目录,执行
mingw32-make.exe -j4
,
-j4
指定我们用4个cpu核心,注意由于我们装的mingw,所以
make
命令变成了
mingw32-make.exe
-
完事后我们就得到了lib文件
-
GLFW就编译完了,关键目录只有两个
- 头文件
path\to\glfw-3.3.6\include
- lib文件
path\to\glfw-3.3.6\build\src
- 头文件
-
在
path\to\glfw-3.3.6\build
目录执行mingw32-make.exe install
(需要管理员权限),文件会被安装到C:/Program Files (x86)/GLFW/
下 -
最后手动复制
glfw3.dll
到C:\Windows\System32
下,不然运行程序会报找不到dll,其他库类似
GLAD
OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。
GLAD会帮我们找到函数位置
- 下载解压后,
include
目录里是俩头文件,src
目录里面就一个glad.c
- 这个
glad.c
后面会直接和程序一起参与编译
到这里就可以创建项目了
创建项目
建立一个名为LearnOpenGL
的文件夹作为项目根目录。整个项目结构是这样的:
-
root(LearnOpenGL)
CMakeLists.txt
- cmake构建文件- cmake/modules/ - 存放cmake自动查找库的find文件
- include/ - 存放头文件
- src/ - 存放源代码
创建窗口
先给出目录细节再详细说,所有参与文件如下:
-
CMakeLists.txt
- cmake构建文件 -
cmake/modules/ - 存放cmake自动查找库的find文件
FindGLFW3.cmake
- 负责自动查找glfw的头文件路径和lib路径
-
include/ - 存放头文件
-
glad.c
- 把安装GLAD时的文件复制过来 -
glad/ - 安装GLAD时的头文件目录,复制过来
glad.h
-
KHR/ - 安装GLAD时的头文件目录,复制过来
khrplatform.h
-
-
src/ - 存放源代码
-
start/ - 存放LearnOpenGL教程第一部分源码
CMakeLists.txt
- 子目录构建文件HelloWindow.cpp
- 创建窗口示例程序
-
1.主CMakeLists.txt
根目录下的CMakeLists.txt
文件是引导cmake的入口,主要做一些项目设置,和头文件,lib等查找工作,详细如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | cmake_minimum_required(VERSION 2.9) # 指定cmake最小版本 project(learnopengl) # 设置项目名 # 依赖环境 # ------------------------------------------------------------------------------ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/") find_package(GLFW3 REQUIRED) include_directories(${GLFW3_INCLUDE_DIR}) add_library(glad include/glad.c) # ------------------------------------------------------------------------------ include_directories(./include) # 添加头文件搜索目录 # 子目录 add_subdirectory(src/start) # 子目录也会有CMakeLists.txt文件,环境是相通的 |
---|---|
主要来看依赖环境部分:
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")` 这句是往`CMAKE_MODULE_PATH`里追加一个目录, 这些目录里存放着各种find文件,命名为`Find${LIB}.cmake
find_package(GLFW3 REQUIRED)
表示调用FindGLFW3.cmake
查找GLFW3的头文件和lib,而且是必须找到,否则构建终止。 如果找到了,会设置GLFW3_XXX
等一系列变量
include_directories(${GLFW3_INCLUDE_DIR})
,find执行成功才会执行这句,变量GLFW3_INCLUDE_DIR
里存放着GLFW头文件的路径,然后添加头文件搜索目录
add_library(glad include/glad.c)
声明一个名为glad
的lib,后面可以指定链接它,glad.c
就会参与编译
2.FindGLFW.cmake
看下项目里GLFW的搜索文件cmake/modules/FindGLFW3.cmake
,这个文件可以在网上找到很多例子,cmake本身也会预装很多find文件。
3.创建窗口
这里和LearnOpenGL里教的一样了就,src/start/HelloWindow.cpp
4.子CMakeLists.txt
最后来写下src/start
目录里的CMakeLists.txt
,来告诉cmake如何编译上面的cpp文件:
1 2 3 | # 你好,窗口 add_executable(HelloWindow HelloWindow.cpp) # 添加可执行程序 target_link_libraries(HelloWindow ${GLFW3_LIBRARY} glad) # 链接lib glfw glad.c |
---|---|
5.编译
回到项目根目录执行:cmake -S . -B build/ -G"MinGW Makefiles"
进入build目录执行:mingw32-make.exe
编译结束后,在build/src/start/
目录里能看到名为HelloWindow.exe
的可执行程序,恭喜
三角形也可以画出来了,具体跟着教程走吧