C++ SDL2+OpenGL访问冲突

C++ SDL2+OpenGL访问冲突,c++,opengl,sdl-2,access-violation,C++,Opengl,Sdl 2,Access Violation,这很好: int main(int argc, char** argv) { SDL_Init(SDL_INIT_VIDEO); SDL_Window* window = SDL_CreateWindow("Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCR_WIDTH, SCR_HEIGHT, SDL_WINDOW_OPENGL); SDL_GL_SetAttribute(S

这很好:

int main(int argc, char** argv)
{
    SDL_Init(SDL_INIT_VIDEO);

    SDL_Window* window = SDL_CreateWindow("Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
SCR_WIDTH, SCR_HEIGHT, SDL_WINDOW_OPENGL);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 6);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

    SDL_GLContext mainContext = SDL_GL_CreateContext(window);

    gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress);

    SDL_Event event;
    int running = 1;

    unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);

    ...

    return 0;
}
但是,如果我将初始化包装到一个类中,我在调用glCreateShader时会遇到访问冲突,即使在初始化SDL和OpenGL时没有收到任何错误消息:

int main(int argc, char** argv)
{
    WindowManager wm;
    if (!wm.Construct())
        return 0;

    SDL_Event event;
    int running = 1;

    unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); //<---- access violation here

    ...        

    return 0;
}
下面是我的WindowManager类及其相关功能:

class WindowManager
{
public:
    WindowManager() = default;
    
    bool Construct()
    {
        if (SDL_Init(SDL_INIT_VIDEO) < 0);
            return false;

        mWindow = SDL_CreateWindow("Game", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, 
        height, SDL_WINDOW_OPENGL);

        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 6);
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

        mContext = SDL_GL_CreateContext(mWindow);

        if (!mWindow)
        {
             spdlog::error("WindowManager could not be created!");

             return false;
        }

        if (!gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress))
        {
            spdlog::error("Failed to initialize GLAD!");

            return false;
        }

        return true;
    }

    SDL_Window* mWindow;
    SDL_GLContext mContext;
};

如果有人能解释一下这个问题,我将不胜感激

由于我将WindowManager编译成一个dll并在一个单独的项目中使用,所以我基本上编写了两个程序

程序A有一个初始化的OpenGL上下文,但使用WindowManager的程序B没有


因此,我必须编写一个函数,将glProcAddress公开给程序B,以便进行原始OpenGL调用,如glCreateShader。

我注意到您没有检查原始版本中的错误!姆温多和!GladLoadGladLoader。。。但你现在是。有没有可能一直都有错误代码,甚至可能是错误代码,但现在你真的因为它而退出了呢?仅仅是这个改变看起来一点问题都没有,可能你的问题在代码的其他部分,我们没有看到。考虑做一个最小的完整可编译的例子,并确保你的问题实际上在这个例子中复制,至少在你的机器上。