glew glfw 搭建opengl 环境时遇到的一些问题记录
windows
即使完全正确配置了 glfw glew 头文件,lib 文件,dll文件后,依然无法调用 gl 相关函数,如glViewport()
一旦调用就会报 gl 函数链接错误
原因:
win32 下必须 link opengl32.lib.
起初我误以为 glew.lib 只要链接好,就可以 调用 gl 相关的函数了。实际上不是这样的,gl函数还是需要 opengl32.lib 链接进去才可以调用。
glfw,glew,opengl 3个库的作用分别如下
glfw:负责创建窗口,处理消息循环
glew:在调用 opengl 相关函数时,不必每次都用 函数指针的方式,检查 机器是否支持 此 gl 函数
opengl:真正的 gl 相关函数,还是需要 link 这个库
今天在搭建环境时,由于没有链接 opengl32.lib (我以为 glew32.lib 链接了就可以调用 opengl相关函数了),导致gl 相关的函数调用不了,卡了很久。还是对 这些库各自的分工职能理解不清晰所致。
mac
mac下 也有 glew ,glfw 库,并且可以通过 brew install glew,brew install glfw 简单的获取到。
但是工程头文件目录,库文件引用 还是要每个工程各自设置.
mac 下 与 opengl32.lib 对应的 gl 库是 OpenGL.framework
如果 引用 OpenGL.framework,则出现的错误 与 windows 下 不 链接 opengl32.lib 的报错是一样的: 无法链接 gl 相关的函数 (比如 glviewport)
mac 下的 glewInit() 必须在 opengl context 创建之后,即 必须在 glfwMakContextCurrent(window)之后。否则 glewInit() 无法创建成功,一些高版本的 gl 函数在调用时,会出现 运行时报错 EXC_BAD_ACCESS
windows 下虽然 glewInit() 调用在前,不会报错,但是用到 gl 一些高版本的函数时,比如 glGenBuffers() ,也会运行时报错
所以,正确的时机调用 glewInit() 是使用 opengl 高版本函数的 必要条件。
另外 :
windows,mac 环境下 ,glew 的头文件都需要在 glfw 之前,否则会无法编译通过.
#define GLEW_STATIC // 根据 glew32s.lib glew32.lib 链接库不同 ,可以选择是否打开这个宏
#include <GL/glew.h>
#include <GLFW\glfw3.h>
(是不是也可以替换成 SDL ?)
opengl库: 提供基本的 gl 函数的支持.opengl 库是写 opengl 程序时所必须的。
glew库: 提供高版本 gl 函数的支持。如果不嫌麻烦的话,也可以手写函数指针,来判断各个 opengl 高版本函数是否支持,但是 glew 库 做了 大大的简化,使得 opengl 各个版本的函数像原生函数一样,可以随意调用。
glew库暂时不知道有没有其他 库 可以替换.
windows
即使完全正确配置了 glfw glew 头文件,lib 文件,dll文件后,依然无法调用 gl 相关函数,如glViewport()
一旦调用就会报 gl 函数链接错误
原因:
win32 下必须 link opengl32.lib.
起初我误以为 glew.lib 只要链接好,就可以 调用 gl 相关的函数了。实际上不是这样的,gl函数还是需要 opengl32.lib 链接进去才可以调用。
glfw,glew,opengl 3个库的作用分别如下
glfw:负责创建窗口,处理消息循环
glew:在调用 opengl 相关函数时,不必每次都用 函数指针的方式,检查 机器是否支持 此 gl 函数
opengl:真正的 gl 相关函数,还是需要 link 这个库
今天在搭建环境时,由于没有链接 opengl32.lib (我以为 glew32.lib 链接了就可以调用 opengl相关函数了),导致gl 相关的函数调用不了,卡了很久。还是对 这些库各自的分工职能理解不清晰所致。
mac
mac下 也有 glew ,glfw 库,并且可以通过 brew install glew,brew install glfw 简单的获取到。
但是工程头文件目录,库文件引用 还是要每个工程各自设置.
mac 下 与 opengl32.lib 对应的 gl 库是 OpenGL.framework
如果 引用 OpenGL.framework,则出现的错误 与 windows 下 不 链接 opengl32.lib 的报错是一样的: 无法链接 gl 相关的函数 (比如 glviewport)
mac 下的 glewInit() 必须在 opengl context 创建之后,即 必须在 glfwMakContextCurrent(window)之后。否则 glewInit() 无法创建成功,一些高版本的 gl 函数在调用时,会出现 运行时报错 EXC_BAD_ACCESS
windows 下虽然 glewInit() 调用在前,不会报错,但是用到 gl 一些高版本的函数时,比如 glGenBuffers() ,也会运行时报错
所以,正确的时机调用 glewInit() 是使用 opengl 高版本函数的 必要条件。
另外 :
windows,mac 环境下 ,glew 的头文件都需要在 glfw 之前,否则会无法编译通过.
#define GLEW_STATIC // 根据 glew32s.lib glew32.lib 链接库不同 ,可以选择是否打开这个宏
#include <GL/glew.h>
#include <GLFW\glfw3.h>
mac环境下,必须加上下面这一行,否则 glfw 无法正常 create window
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
附代码:
#define GLEW_STATIC #include <GL/glew.h> #include <GLFW\glfw3.h> #include <iostream> using namespace std; int main() { //glewInit(); //glewIsSupported("GL_VERSION_2_0"); 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); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); GLFWwindow* window = glfwCreateWindow(200, 200, "m30", nullptr, nullptr); if (window == nullptr) { cout << "Failed to create GLFW window" << endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); int width, height; glfwGetFramebufferSize(window, &width, &height); glewInit(); glViewport(0, 0, width, height); //glViewport(0, 0, width, height); GLuint buffer[1]; glGenBuffers(1, buffer); glGetString(0); while (!glfwWindowShouldClose(window)) { //cout << "m30" << endl; glfwPollEvents(); glfwSwapBuffers(window); } glfwTerminate(); return 0; }
总结:
(是不是也可以替换成 SDL ?)
opengl库: 提供基本的 gl 函数的支持.opengl 库是写 opengl 程序时所必须的。
glew库: 提供高版本 gl 函数的支持。如果不嫌麻烦的话,也可以手写函数指针,来判断各个 opengl 高版本函数是否支持,但是 glew 库 做了 大大的简化,使得 opengl 各个版本的函数像原生函数一样,可以随意调用。
glew库暂时不知道有没有其他 库 可以替换.