c++ - 调用 glewInit() 导致 main 函数不被调用

标签 c++ glfw glew

我正在尝试使用 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
我这辈子都想不通。我调用 glewInit制作 OpenGL 窗口后,我正在导入 glew之前 glfw .我究竟做错了什么?

最佳答案

main 之前的崩溃是由于静态初始化或动态库。
看来您在 Windows 上,在这种情况下 glew发布文件包含两个库 glew32.libglew32s.lib .
您正在链接非静态链接,请尝试 -lglew32s .第一个只是一个将搜索.dll 的 stub ,通常位于glew/bin。文件夹,您必须使用 main.exe 将其复制到工作目录.删除 GLEW_STATIC如果你选择走这条路。
为防止将来出现错误,请添加 glewExperimental=GL_TRUE; glewInit 之前的某处.它在某些驱动程序上启用 OpenGL 3.3+ 功能。
至于为什么它现在可以工作,首先存在扩展加载库的全部原因是默认驱动程序仅包含 OpenGL 1.x 功能。所有较新的函数必须在运行时直接从 .dll 加载。您的 GPU 使用 dllopen() 提供的驱动程序和 GetProcAddress()这正是这些库为您所做的。这就是为什么大多数较新的函数实际上是作为宏实现的(包装函数指针)。也就是说,您没有使用任何新功能(您确实应该使用),所以一切正常。

关于c++ - 调用 glewInit() 导致 main 函数不被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63988496/

相关文章:

c++ - 堆栈和队列以测试回文

c++ - 使用 C++ WINSOCK(TCP、SSL)发送电子邮件

c++ - OpenGL 不绘图

C++ SFML 2.1 未定义对 GLEW 的引用

c++ - 如何使用 QSettings 在 Qt 应用程序中加载设置

C++ 无法将参数 1 从 'KeyValue<K,V> *' 转换为 'const T &'

c++ - 如何在 OpenGL 中使用 GLM?

C++ OpenGL 程序 - 添加图标

c++ - 无法部署 GLFW 3.2

c - 使用 GLEW 2.0 的 glewInit 段错误