C++ 调用glewInit()会导致不调用主函数

C++ 调用glewInit()会导致不调用主函数,c++,glfw,glew,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;

我正在尝试使用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;
}
程序以静默方式退出。我用断点确认,
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
release文件包含两个库
glew32.lib
glew32s.lib

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

为防止将来出现错误,请添加
glewExperimental=GL\u TRUE
在glewInit之前的某个地方。它在某些驱动程序上启用OpenGL 3.3+功能


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

使用
-lglew32s
给了我一系列错误,例如
未定义对
\u imp\u wglGetProcAddress'`的引用。我认为glew的麻烦比它的价值还多,我只想用glew。谢谢你的帮助@multitaskPro对此不确定,您可以链接
opengl32
。是的,我也极力推荐
glad
,一个标题,一个源代码,我从来没有遇到过任何问题。
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