C++ glewInit()失败,并带有“0”;缺少GL版本“;,SDL2 OpenGL上下文,cygwin编译器

C++ glewInit()失败,并带有“0”;缺少GL版本“;,SDL2 OpenGL上下文,cygwin编译器,c++,opengl,cygwin,glew,sdl-2,C++,Opengl,Cygwin,Glew,Sdl 2,下面的程序创建了一个窗口,当您按esc键时,该窗口除了关闭之外什么也不做。当我用cygwin编译它时,没有错误。我使用的GLEW来自,SDL2是版本2.0.3,来自他们的SDL2-devel-2.0.3-mingw.tar.gzdownload。我在编译的可执行文件目录中有SDL2.dll 链接到:-lSDL2-lSDL2main-lGLEW-lGLU-lGL-lSDL2-lSDL2main-lGLEW-lGLU-lGL,两次以确保所有内容都已链接 还使用编译:-std=c++11 在我的计算机

下面的程序创建了一个窗口,当您按esc键时,该窗口除了关闭之外什么也不做。当我用cygwin编译它时,没有错误。我使用的GLEW来自,SDL2是版本2.0.3,来自他们的
SDL2-devel-2.0.3-mingw.tar.gz
download。我在编译的可执行文件目录中有SDL2.dll

链接到:
-lSDL2-lSDL2main-lGLEW-lGLU-lGL-lSDL2-lSDL2main-lGLEW-lGLU-lGL
,两次以确保所有内容都已链接

还使用编译:
-std=c++11

在我的计算机上,打印出以下程序:

OpenGL Vendor: (null)
OpenGL Renderer: (null)
OpenGL Shading Language Version: (null)
OpenGL Extensions: (null)
Error initializing GLEW! Missing GL version
该程序似乎在其他情况下工作。主要问题是,如果我尝试调用,例如
glgenvertexarray
,程序将因
状态\u访问\u冲突而崩溃。(参见崩溃代码。我认为这与GLEW的错误
缺少GL版本有关

#include <cstdio>

#include <chrono>
#include <thread>

#include <SDL2/SDL.h>

#include <GL/glew.h>

#include <SDL2/SDL_opengl.h>

#include <GL/glu.h>

const int width = 1000;
const int height = 500;
bool Running = true;

#undef main
int main (int argc, char *argv[]) {
    FILE* cdebug = fopen("cdebug.txt", "w");

    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        fprintf(cdebug, "SDL could not initialize! SDL Error: %s\n", SDL_GetError()); fflush(cdebug);
    }

    #define setAttr(attr, value) \
        if (SDL_GL_SetAttribute(attr, value) < 0) { \
            fprintf(cdebug, "SDL failed to set %s to %s, SDL Error: %s\n", #attr, #value, SDL_GetError()); fflush(cdebug);\
        }
    setAttr(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    setAttr(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    setAttr(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

    setAttr(SDL_GL_RED_SIZE, 8);
    setAttr(SDL_GL_GREEN_SIZE, 8);
    setAttr(SDL_GL_BLUE_SIZE, 8);
    setAttr(SDL_GL_DEPTH_SIZE, 24);
    setAttr(SDL_GL_DOUBLEBUFFER, 1);
    #undef setAttr
    /*
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

    SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    */
    SDL_Window *window = SDL_CreateWindow(
            "test",
            SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
            640, 480,
            SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE
    );
    if (window == NULL) {
        fprintf(cdebug, "Window could not be created! SDL Error: %s\n", SDL_GetError()); fflush(cdebug);
    }

    SDL_GLContext GLContext = SDL_GL_CreateContext(window);
    if (GLContext == NULL) {
        fprintf(cdebug, "OpenGL context could not be created! SDL Error: %s\n", SDL_GetError()); fflush(cdebug);
    }
    if (SDL_GL_MakeCurrent(window, GLContext) < 0) {
        fprintf(cdebug, "OpenGL context could not be made current! SDL Error: %s\n", SDL_GetError()); fflush(cdebug);
    }

    fprintf(cdebug, "OpenGL Vendor: %s\n", glGetString(GL_VENDOR));
    fprintf(cdebug, "OpenGL Renderer: %s\n", glGetString(GL_RENDERER));
    fprintf(cdebug, "OpenGL Shading Language Version: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
    fprintf(cdebug, "OpenGL Extensions: %s\n", glGetString(GL_EXTENSIONS));
    fflush(cdebug);

    glewExperimental = GL_TRUE;
    {
        GLenum glewError = glewInit();
        if (glewError != GLEW_OK) {
            fprintf(cdebug, "Error initializing GLEW! %s\n", glewGetErrorString(glewError)); fflush(cdebug);
        }
    }

    SDL_Event event;
    while (Running) {
        while (SDL_PollEvent(&event)) {
            switch (event.type) {
                case SDL_KEYUP: {
                    switch (event.key.keysym.scancode) {
                        case SDL_SCANCODE_ESCAPE:
                            Running = false;
                            break;
                    }
                    break;
                }

            }
        }

        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        SDL_GL_SwapWindow(window);
        std::this_thread::sleep_for(std::chrono::milliseconds(50));
    }

    SDL_GL_DeleteContext(GLContext);

    SDL_DestroyWindow(window);
    window = NULL;

    SDL_Quit();

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
常数整数宽度=1000;
const int height=500;
bool Running=true;
#未定义主
int main(int argc,char*argv[]){
文件*cdebug=fopen(“cdebug.txt”,“w”);
if(SDL_Init(SDL_Init_视频)<0){
fprintf(cdebug,“SDL无法初始化!SDL错误:%s\n”,SDL_GetError());fflush(cdebug);
}
#定义setAttr(attr,value)\
如果(SDL_GL_SetAttribute(attr,value)<0){\
fprintf(cdebug,“SDL未能将%s设置为%s,SDL错误:%s\n”,#attr,#value,SDL_GetError());fflush(cdebug)\
}
setAttr(SDL、GL、上下文、主要版本,3);
setAttr(SDL_GL_上下文_次要版本,3);
setAttr(SDL\u GL\u上下文\u概要文件\u掩码,SDL\u GL\u上下文\u概要文件\u核心);
设置属性(SDL\U GL\U RED\U尺寸,8);
setAttr(SDL_GL_绿色_尺寸,8);
setAttr(SDL_GL_蓝色_尺寸,8);
设置属性(SDL\U GL\U深度\U大小,24);
setAttr(SDL\U GL\U双缓冲区,1);
#未定义设置属性
/*
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_设置属性(SDL_GL_红色_大小,8);
SDL_GL_设置属性(SDL_GL_绿色_大小,8);
SDL_GL_SetAttribute(SDL_GL_BLUE_大小,8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
*/
SDL_Window*Window=SDL_CreateWindow(
“测试”,
SDL_WINDOWPOS_未定义,SDL_WINDOWPOS_未定义,
640, 480,
SDL_WINDOW_OPENGL | SDL_WINDOW_可调整大小
);
如果(窗口==NULL){
fprintf(cdebug,“无法创建窗口!SDL错误:%s\n”,SDL\u GetError());fflush(cdebug);
}
SDL_GLContext GLContext=SDL_GL_CreateContext(窗口);
if(GLContext==NULL){
fprintf(cdebug,“无法创建OpenGL上下文!SDL错误:%s\n”,SDL_GetError());fflush(cdebug);
}
如果(SDL\U GL\U MakeCurrent(窗口,GLContext)<0){
fprintf(cdebug,“OpenGL上下文无法设置为当前!SDL错误:%s\n”,SDL_GetError());fflush(cdebug);
}
fprintf(cdebug,“OpenGL供应商:%s\n”,glGetString(GL_供应商));
fprintf(cdebug,“OpenGL渲染器:%s\n”,glGetString(GL_渲染器));
fprintf(cdebug,“OpenGL着色语言版本:%s\n”,glGetString(GL_着色语言版本));
fprintf(cdebug,“OpenGL扩展:%s\n”,glGetString(GL_扩展));
fflush(cdebug);
glewExperimental=GL_TRUE;
{
GLenum glewError=glewInit();
如果(glewError!=GLEW_OK){
fprintf(cdebug,“初始化GLEW时出错!%s\n”,glewGetErrorString(glewError));fflush(cdebug);
}
}
SDL_事件;
(跑步时){
while(SDL_事件和事件)){
开关(事件类型){
案例SDL_密钥更新:{
开关(event.key.keysym.scancode){
案例SDL\U扫描代码\U逃生:
运行=错误;
打破
}
打破
}
}
}
glClearColor(0.0f、0.0f、0.0f、1.0f);
glClear(GLU颜色缓冲位);
SDL_GL_SwapWindow(窗口);
std::this_线程::sleep_for(std::chrono::毫秒(50));
}
SDL_GL_DeleteContext(GLContext);
SDL_窗口(窗口);
窗口=空;
SDL_退出();
返回0;
}

你把cygwin和mingw混为一谈的方式是你不应该的

如果您使用cygwin的工具链和
-lGL
等等,那么您可以链接cygwin的OpenGL,它不是windows上的原生OpenGL库,而是cygwin的X服务器提供的实现GLX协议的库

SDL的mingw版本将在windows上使用本机GL库(
opengl32.dll
),使用wgl API。因此SDL甚至可能为您创建上下文,但您的程序调用的GL函数属于完全不同的GL实现-您的程序从未为其创建过GL上下文

解决方案是坚持其中一种:完全使用cygwin、cygwin版本的SDL和cygwin X服务器。但是,这不是我建议的路径。我不知道这是否会让您获得一些硬件加速


更有用的解决方案是在整个项目中不使用cygwin,而是使用mingw,使用mingw版本的GLEW。这将产生一个完全本机的windows binrary,它将使用本机OpenGL库以及驱动程序提供的所有功能,并且不需要cygwin的DLL,尤其不需要cygwin的X服务器。

事情以一种奇怪的方式运作

我使用的是SDL2的自编译版本,但SDL网站提供的
SDL2-devel-2.0.3-mingw.tar.gz
似乎也能工作,并且使用它们的组合(例如mingw版本的libs和self-compiled.dll)似乎也能工作

对于GLEW,我使用自己的co