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库暂时不知道有没有其他 库 可以替换.