无法使用 GLFW3 初始化 GLew

Posted

技术标签:

【中文标题】无法使用 GLFW3 初始化 GLew【英文标题】:Cant initialize GLew with GLFW3 【发布时间】:2014-01-06 05:13:15 【问题描述】:

我正在尝试初始化 GLew 1.10 以及最新版本的 GLFW3。 我已经设法让 GLFW3 毫无问题地工作,但 GLew 非常困难。我遵循了 GLew 网站上关于如何初始化的示例,但由于某种原因,glewInit() 未定义,glewGetContext identifier not found / undefined(底部有错误):

#include <GLew110\glew.h>
#define GLFW_INCLUDE_GLU
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>

static void error_callback(int error, const char* description)

    fputs(description, stderr);

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)

    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
    glfwSetWindowShouldClose(window, GL_TRUE);

int main(void)
   
    GLFWwindow* window;
    glfwSetErrorCallback(error_callback);
    if (!glfwInit())
        exit(EXIT_FAILURE);
    window = glfwCreateWindow(800, 600, "Simple example", NULL, NULL);
    if (!window)
    
        glfwTerminate();
        exit(EXIT_FAILURE);
    

    GLenum err = glewInit(); // <---- "glewGetContext" is undefined (line 29)
    if (GLEW_OK != err)
    
        /* Problem: glewInit failed, something is seriously wrong. */
        fprintf(stderr, "Error: %s\n", glewGetErrorString(err));

    

    glfwMakeContextCurrent(window);
    glfwSetKeyCallback(window, key_callback);
    while (!glfwWindowShouldClose(window))
    
        float ratio;
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        ratio = width / (float) height;
        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f);
        glBegin(GL_TRIANGLES);
        glColor3f(1.f, 0.f, 0.f);
        glVertex3f(-0.6f, -0.4f, 0.f);
        glColor3f(0.f, 1.f, 0.f);
        glVertex3f(0.6f, -0.4f, 0.f);
        glColor3f(0.f, 0.f, 1.f);
        glVertex3f(0.f, 0.6f, 0.f);
        glEnd();
        glfwSwapBuffers(window);
        glfwPollEvents();
    
    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);

列出了两个错误:

error C3861: 'glewGetContext': identifier not found (line 29 pointing to glewInit())
IntelliSense: identifier "glewGetContext" is undefined (line 29)

【问题讨论】:

这听起来像是一个编译/链接问题,但问题并不是 100% 清楚。请发布一个完整的小示例程序来显示问题(听起来像一个只有glewInit() 调用的程序就可以解决问题),然后复制/粘贴确切的错误消息。 @MichaelBurr 感谢您的回复。我已经更新了代码(可运行)并在底部列出了我收到的两个错误。删除假设初始化 GLew 的代码将显示一个旋转的彩色三角形。 glewinit 应该在 glfwMakeCurrentContext 之后 附注:请不要在包含指令中使用反斜杠'\' 【参考方案1】:

有些东西正在定义宏 GLEW_MX,它用于为多个渲染上下文配置 glew 库。使用这种配置进行构建需要一些特殊的准备。以下来自http://glew.sourceforge.net/advanced.html(强调添加):

多个渲染上下文 (GLEW MX)

从 1.2.0 版开始,线程安全支持多个 渲染上下文,可能具有不同的功能,是 可用的。由于大多数用户不需要此功能,因此未添加 到二进制版本以保持不同之间的兼容性 版本。要包括多上下文支持,您必须执行 以下:

在定义了 GLEW_MX 预处理器令牌的情况下编译和使用 GLEW。 为每个渲染上下文创建一个 GLEWContext 对象,只要渲染上下文存在,该对象就可用。 定义一个名为 glewGetContext() 的宏或函数,它返回一个指向与渲染关联的 GLEWContext 对象的指针 发出 OpenGL/WGL/GLX 调用的上下文。本次派遣 机制是原始的,但通用的。 确保在每个渲染上下文中创建 GLEWContext 对象后调用 glewInit()。请注意,GLEWContext 指针 glewGetContext() 返回的必须驻留在全局或线程本地 记忆。

如果您不需要多个渲染上下文,最好的办法可能是找出 GLEW_MX 的设置位置并修复它。

【讨论】:

【参考方案2】:

以防万一有人遇到类似问题。 请在调用 glfwMakeContextCurrent 后尝试调用 glewInit :)

/* Make the window's context current */
glfwMakeContextCurrent(window);
int glewErr = glewInit();

【讨论】:

以上是关于无法使用 GLFW3 初始化 GLew的主要内容,如果未能解决你的问题,请参考以下文章

GLEW 无法初始化

带有 cmake 和 glew glfw3 和 glm 库的 Opengl

无法创建 GLFW 窗口

GLFW3 中是不是有 glutDisplayFunc 等价物?

OpenGL配置GLFW与GLEW的问题

多个对象无法渲染?