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>

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

总结:

glfw库: 用于处理 各个平台 的 窗口创建,事件循环.通常可以替换成为其他,比如glut,freeglut 等界面库
(是不是也可以替换成 SDL ?)

opengl库: 提供基本的 gl 函数的支持.opengl 库是写 opengl 程序时所必须的。

glew库: 提供高版本 gl 函数的支持。如果不嫌麻烦的话,也可以手写函数指针,来判断各个 opengl 高版本函数是否支持,但是 glew 库 做了 大大的简化,使得 opengl 各个版本的函数像原生函数一样,可以随意调用。
glew库暂时不知道有没有其他 库 可以替换.

glew glfw opengl 之间的关系相关推荐

  1. OpenGL之glut、glfw、glew、glad等库之间的关系

    结论 1.glad与glew作用类似,实现对底层OpenGL接口封装 2.glfw与glut作用类似,创建窗口界面 3.glut年代久远,现在用glfw居多,可使用glfw+glad组合方式,比如这个 ...

  2. OpenGL与gl glu glut freeglut glew glfw封装库关系(十五)

    1.概述     初学者往往搞不明白OpenGL与诸多库的联系下面一张图帮理清楚,gl glu glut freeglut glew glfw都是对OpenGL的封装而已.这些库已经将OpenGL.E ...

  3. OpenGL ES glut glew glfw glad freeglut

    目录 一.简介 1.freeglut 2.glew 3.glut 4.glfw 5.glad 二.分类 1.窗口管理 2.函数加载 三.组合使用 1.freeglut + glew 2.glfw + ...

  4. 开源项目推荐:OpenGL之gult/freeglut/glew/glfw/glad的联系与区别

    本篇内容主要参考了文章:OpenGL+VS2017 环境配置(亲测好使)::附带必要知识点_FuXiii的博客-CSDN博客_vs2017环境配置,但是经过本人局部修改,并添加了个人见解. 1.Ope ...

  5. OpenGL之gult/freeglut/glew/glfw/glad的联系与区别

    转 https://blog.csdn.net/libaineu2004/article/details/105879521 转 https://blog.csdn.net/qq_40565033/a ...

  6. OpenGL - 如何理解 VAO 与 VBO 之间的关系

    系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGL LearnOpenGL 笔记 - 入门 02 创建窗口 LearnOpenGL 笔记 - 入门 03 你好,窗口 LearnO ...

  7. Android中的APK,TASK,PROCESS,USERID之间的关系

    开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...

  8. 《纯技术分析阿里云OS和Android之间的关系》补充

    前面一份投稿的错误很抱歉,rom本身就找错了,用了一个AOSP-like的刷机包.好在这份内容错误的投稿多少起到了抛砖引玉的作用,当天晚上,就给出了正确的rom的分析<纯技术分析阿里云OS和An ...

  9. 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系

    Android - SurfaceFlinger 图形系统 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文 ...

最新文章

  1. ZEGO即构科技携小程序连麦直播方案亮相GMIC
  2. 软件定义闪存存储系统关键技术
  3. Qt Creator 代码自动补全设置
  4. mysql ef 随机排序_EFCore+Mysql倉儲層建設(分頁、多字段排序、部分字段更新)
  5. TensorFlow 常见API
  6. 【jeecg移动开发能力】Jeecg 重磅来袭,强大移动报表配置能力,一次配置七种展现风格
  7. MyBatis框架 动态SQL
  8. 【Java】字符串String操作
  9. 设计模式原则之五:里氏置换原则
  10. 【项目管理一点通】(48) 项目结项
  11. ArduinoUNO-IRremote 红外线接收模块使用(还没写完)
  12. 鲁大师电脑硬件兼容性测试软件,用鲁大师检测软件检测电脑硬件行得通吗?
  13. 苹果 服务通知 V2
  14. SwiftUI接入穿山甲开屏广告
  15. 直接杀向3G市场!华为两款新手机曝光
  16. Linus Torvalds 在 22 号宣布Linux 5.18发布
  17. 医用IT隔离电源在医院特殊场所接地系统的应用
  18. 8.1 标量、向量、矩阵和张量
  19. Java Web前后端分离项目—后端servlet实例
  20. e339 java_java-在Spring Mongo中从文档数组中删除项目

热门文章

  1. python 西门子触摸屏通讯_西门子触摸屏以太网通讯设置
  2. c语言8行7列星号矩形,C语言程序设计课件_完整版.ppt
  3. 逻辑回归中常用的概念: WOE、IV详解
  4. 【Docker】win7安装docker及镜像加速
  5. 海思高校合作——QA培训资料
  6. Android Hanlder的理解
  7. 操作系统---linux
  8. 斐讯k3搭建nginx+php+MariaDB(mysql )的教程
  9. 蓝桥杯嵌入式 - 第九届决赛试题(电子秤)
  10. 最简单的分压和低频滤波电路