GLEW _First 是 nullptr

Posted

技术标签:

【中文标题】GLEW _First 是 nullptr【英文标题】:GLEW _First was nullptr 【发布时间】:2017-02-23 20:05:44 【问题描述】:

所以我一直在使用 GLFW 和 GLEW 通过 C++ 开发游戏,一切都很顺利,直到我实现了 GLEW,然后我收到了一个我以前从未遇到过的错误,我不知道该怎么做,我用谷歌搜索并做了一些研究,但无济于事。我注意到在堆栈框架部分它说与我的 main.cpp 中的这行代码有关

std::cout << glGetString(GL_VERSION) << std::endl;

它还说与记忆有关。我会将其余代码留在下面,如果您需要任何信息,请尽管询问,我会尽力提供

所以我才发现如果我拿出来

std::cout << glGetString(GL_VERSION) << std::endl;

然后它可以工作,但是没有创建窗口。

我从这里去哪里? 有什么想法吗?

   #include "src\graphics\window.h"
int main() 
    using namespace benji;
    using namespace graphics;

    Window window("Benji Engine", 1280, 720);
    glClearColor(0.2f, 0.3f, 0.8f, 1.0f);
    std::cout << glGetString(GL_VERSION) << std::endl;``

    while (!window.closed()) 
        std::cout << window.getWidth() << ", " << window.getHeight() << std::endl;
        window.clear();
        glBegin(GL_TRIANGLES);
        glVertex2f(-0.5f, -0.5f);
        glVertex2f(0.0f, 0.5f);
        glVertex2f(0.5f, -0.5f);
        glEnd();
        window.update();
    

    return 0;

main.h

 #pragma once
    class main
    
    public:
        main();
        ~main();
    ;

window.cpp

#include "window.h"

namespace benji  namespace graphics 


void windowResize(GLFWwindow *window, int width, int height);

Window::Window(const char *title, int width, int height) 
    m_Title = title;
    m_Width = width;
    m_Height = height;
    if (!init()) 
        glfwTerminate();
    



Window::~Window() 
    glfwTerminate();



bool Window::init() 
    if (!glfwInit()) 
        std::cout << "Failed to initialize GLFW!" << std::endl;
        return false;
    

    m_Window = glfwCreateWindow(m_Width, m_Height, m_Title, NULL, NULL);
    if (!m_Window) 
        std::cout << "Failed to create GLFW window!" << std::endl;
        return false;
    
    glfwMakeContextCurrent(m_Window);
    glfwSetWindowSizeCallback(m_Window, windowResize);

    if (glewInit != GLEW_OK) 
        std::cout << "GLEW FAILED!" << std::endl;
        return false;
    
    return true;




void Window::clear() const 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


void Window::update()
    glfwPollEvents();
    glfwSwapBuffers(m_Window);




    bool Window::closed() const 
    return glfwWindowShouldClose(m_Window) == 1;


    void windowResize(GLFWwindow *window, int width, int height) 
        glViewport(0, 0, width, height);
    

window.h

 #pragma once
    #include <iostream>
    #include <GL\glew.h>
    #include <GLFW\glfw3.h>

namespace benji 
    namespace graphics 
        class Window 
        private:
            const char *m_Title;
            int m_Width, m_Height;
            GLFWwindow *m_Window;
            bool m_Closed;

        public:
            Window(const char *title, int width, int height);
            ~Window();
            bool closed() const;
            void update();
            void clear() const;

             int getWidth() const 
                return m_Width;

            
             int getHeight() const  return m_Height; 
        private:
            bool init();

        ;



【问题讨论】:

完整的错误是什么?你有调试调用堆栈或任何其他信息吗? 我能看到的唯一其他错误是抛出异常:读取访问冲突。 _First 是 nullptr。 如果glGetString确实崩溃了,那是因为你的OpenGL没有被正确初始化。您在Window::init 期间是否收到任何错误输出?这也得到了以下事实的支持:当您删除对glGetString 的调用时,它不会崩溃,但不会打开任何窗口。另见“Why Could glGetString(GL_VERSION) Be Causing a Seg Fault?” 我一直在按照教程来初始化 OpenGL,因为这是我第一次这样做,而且它似乎对我来说是正确的,所以我不确定。 【参考方案1】:

在 Window.cpp 中:

if (glewInit != GLEW_OK) 
    std::cout << "GLEW FAILED!" << std::endl;
    return false;

glewInit() 是一个函数,而不是一个变量。您需要将其作为函数调用。我很惊讶这甚至被编译了。

来自 1.1 版之后的所有其他 OpenGL 函数将抛出 ACCESS_VIOLATION READING ADDRESS 0x00000000 或类似错误的错误,因为如果未正确调用 glewInit(),则 GLEW 提供的函数宏都不会指向有效函数指针。

【讨论】:

I'm surprised this even compiled,如果这不仅仅是将代码复制到问题中的错误,我也是。但是很好,我设法多次看过去。 @ssell 我不久前停止使用 GLEW(切换到 glBinding)并且不记得 GLEW 是否使所有内容都衰减为函数指针,或者只是 gl* 函数本身。如果它对所有事情都这样做,那至少可以解释程序编译的原因(但不能正确运行)。 那么你会建议不要使用 GLEW 吗? @RyanMidgley 我不会在这方面提出建议。与 GLEW 的界面相比,我个人更喜欢 glBinding 的界面,但并不是每个人都会有同样的感受。 只是想让你知道我是如何修复它的,我忘记了 glewInit 之后的括号。有些东西真的很微不足道,但这就是问题哈哈

以上是关于GLEW _First 是 nullptr的主要内容,如果未能解决你的问题,请参考以下文章

GLEW 链接器错误

客户端程序中的 glewInit() 和 GLEW_ARB_xxx_ 失败

使用SDL和GLEW设置Visual Studio项目

2.First Polygon

GLEW 未在 MSYS2 上定位 OpenGL 函数

opengl程序在别人电脑上vs上运行没问题,在我电脑上就一直报连接错误,觉得是glew配置问题。