【笔记】创建一个窗口

教程原文:https://bullteacher.com/3-createawindow.html

这一章的大部分内容都在介绍如何构建开发环境。

配置开发环境

MinGW

MinGW的安装很顺利,只是下载花了一些时间。网上有很多安装教程,我参考了这些:

根据网上的教程,配置完环境变量后就可以使用make命令了。下图是 make -version 执行的结果。

make

有一点需要留意:网上有些教程会让你把 mingw32-make.exe 重命名成 make.exe。最好不要直接重命名,而是先把 mingw32-make.exe 复制一份,再把复件改名为 make.exe

原因是我把 CMake 的编译器设定为 MinGW gcc 后,CMake需要把 CMAKE_MAKE_PROGRAM 变量的值设为 mingw32-make.exe 文件所在的路径,名字变成 make.exe 之后CMake就不认账了。我觉得这是个挺傻的bug。不过为了让CMake能正常工作,我还是把 make.exe 文件复制了一份,把复件重命名为 mingw32-make.exe

CMake

CMake的安装也很简单。我直接下载了官方的 cmake-3.11.1-win64-x64.msi,然后就搞定了。通过开始菜单,可以打开 cmake-gui。命令行下输入 cmake -version 可以查看安装的版本。

cmake

GLEW

我没有直接从GLEW官网下载编译好的文件,而是自己编译源代码。主要问题是,我发现官网提供的win32文件是用于VC++编译器的,似乎与MinGW gcc编译器不太兼容。具体情况可以看下文:

https://stackoverflow.com/questions/43860902/linking-glew-with-mingw64-undefined-reference-to-imp-glewexperimental-and

有了 CMake 和 MinGW,其实编译GLEW也不是很麻烦的事情。根据网上的教程,步骤是这样的:

1、获得GLEW源代码

可以直接从 GLEW官网 下载,或者从 Github 的代码仓库下载。

我直接从官网下载了 glew-2.1.0.zip ,解压后得到这些东西。

glew_src

GLEW支持CMake编译,CMakeList.txt文件位于 ./build/cmake/ 目录下。

2、使用cmake生成Makefile文件

运行cmake-gui,将Source径设为 CMakeLists.txt文件所在的路径,并把Build路径设置到 build 目录下。

glew_cmake_gui

点击 configure 按钮,在弹出的配置窗口中将生成目标设置为 MinGW Makefiles,并且在下面的选项中选择 Specify native compilers,因为我要把编译器指定为 MinGW 的 gcc 和 g++ 编译器。

glew_cmake_conf

指定 C 和 C++ 编译器为 MinGW 目录下的编译器。

glew_cmake_compilers

点击 finish,cmake就会根据参数来生成配置文件。

glew_cmake_generate

再点击 generate,cmake就会生成Makefile文件,该文件保存在前面设置的 Build 目录下。

glew_makefile

3、使用make工具编译glew

有了Makefile,剩下的事情就简单了。打开cmd/powershell/gitbash之类的命令行工具,进入Makefile所在的目录,然后执行make命令即可。编译生成的文件保存在 build/binbuild/lib 目录下。

glew_make

继续执行 make install 命令,开发OpenGL程序所需的 .h、.dll、.lib文件都会被收集起来,然后保存到 C:\Program Files(x86)\glew\ 目录下。

glew_make_install

GLEW这就算搞定了。把 include、lib目录下的东西,分别拷贝到 MinGW 的 include、lib目录下,开发 OpenGL 程序时用得着。

GLFW3

我直接从GLFW官网下载了编译好的文件,因为glfw3非常贴心地提供了 mingw 版本。

glfw3_bin

GLFW官方教程使用了GLAD,可以从 http://glad.dav1d.de/ 下载。虽然目前还用不着GLAD,但还是先把地址收藏起来以备后患。

如果想编译glfw的源代码,用CMake也不是什么难事。源码可以通过GLFW官网或者Github下载。

glfw_src

CMakeLists.txt文件就在源码的根目录下,把cmake-gui的Source目录设置到这里,然后生成Makefile文件即可。

glfw3_cmake_configure

然后用 makemake install 编译。

glfw_make

生成的库文件保存在 C:\Program Files (x86)\GLFW\ 目录下,把include 和 lib 目录下的东西分别拷贝到 MinGW 的 include 和 lib 目录,以备后续使用。

创建工程

OK,准备工作差不多了,可以用Eclipse CDT写OpenGL程序了。

先创建一个C++ Project,选择编译器为MinGW gcc。然后右键打开工程的Properties窗口,在C/C++ Build > Settings 中配置MinGW C++ Linker。

cpp_project_settings

F:\MinGW\lib 目录设为搜索目录,这样Eclipse就知道该去哪里找链接库。然后,在上面的窗口中依次添加 glew32glfw3gdi32opengl32

接下来,把 glew32.dll 拷贝到工程目录下。编译 GLEW 时,这个文件被放在了 C:\Program Files(x86)\glew\bin 目录下。

glew32_dll

接下来就可以根据教程来写代码了,创建一个窗口就行。

#include <GL/glew.h>
#include <GLFW/glfw3.h>

#include <iostream>

int main() {
    // 初始化GLFW
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    // 创建窗口
    GLFWwindow * window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
    glfwMakeContextCurrent(window);
    if (window == NULL) {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }

    // 初始化GLEW
    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK) {
        std::cout << "Failed to initialize GLEW" << std::endl;
        return -1;
    }

    // 视口
    glViewport(0, 0, 800, 600);

    // 主循环
    while (!glfwWindowShouldClose(window)) {
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // 关闭
    glfwDestroyWindow(window);
    glfwTerminate();

    return 0;
}

编译,运行。

04_hello_world