调用glewInit导致主函数不被调用

问题描述

我正在尝试使用GLFW和GLEW。目前,我的代码有效,并且我看到一个带有三角形的窗口:

#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <time.h>

#include "constants.h"

int main(void) {
    GLFWwindow* window;

    if (!glfwInit()) {
        glfwTerminate();
        return -1;
    }

    /* Create a windowed mode window and its OpenGL context */
    window = glfwCreateWindow(WINDOW_WIDTH,WINDOW_HEIGHT,"Window",NULL,NULL);
    if (!window) {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    // if (glewInit() != GLEW_OK) {
    //  fprintf(stderr,"failure");
    //  return -1;
    // }

    glfwSetInputMode(window,GLFW_STICKY_KEYS,GL_TRUE);
    while (glfwGetKey(window,GLFW_KEY_ESCAPE ) != GLFW_PRESS && glfwWindowShouldClose(window) == 0) {
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_TRIANGLES);
        glVertex2f(0,0);
        glVertex2f(0,1);
        glVertex2f(1,0);
        glEnd();

        glfwSwapBuffers(window); /* Swap front and back buffers */
        glfwPollEvents();
    }

    glfwTerminate();
    return 0;
}

上面的代码有效。但是,当我取消注释时:

if (glewInit() != GLEW_OK) {
    fprintf(stderr,"failure");
    return -1;
}

程序以静默方式退出。我用断点确认了main函数甚至没有被调用。如果有帮助,这是我的编译命令:

g++ -g main.cpp -I\glfw-3.3.2\include -I\glew-2.1.0\include -L\glfw-3.3.2\lib-mingw-w64 -L\glew-2.1.0\lib\Release\x64 -lglfw3 -lgdi32 -lopengl32 -luser32 -lshell32 -lglew32 -o main.exe

我一生都无法解决。我在制作OpenGL窗口后调用glewInit,在glew之前导入glfw。我在做什么错了?

解决方法

main崩溃是由于静态初始化还是动态库

似乎您在Windows上,在这种情况下,glew版本文件包含两个库glew32.libglew32s.lib

您要链接到非静态链接,请尝试-lglew32s。第一个只是一个存根,它将搜索通常位于glew/bin文件夹中的.dll,您必须使用main.exe将其复制到工作目录。如果选择这种方式,请删除GLEW_STATIC

为防止将来发生错误,请在glewExperimental=GL_TRUE;之前添加glewInit。它在某些驱动程序上启用OpenGL 3.3+功能。

至于现在为什么起作用,首先存在扩展加载库的全部原因是默认驱动程序仅包含OpenGL 1.x功能。必须在运行时使用.dlldllopen()从GPU提供的GetProcAddress()驱动程序中直接加载所有较新的函数,这正是这些库为您提供的功能。这就是为什么大多数较新的函数实际上都实现为宏(包装函数指针)的原因。就是说,您没有使用任何新功能(实际上应该使用),所以一切正常。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...