Получение ошибки во время выполнения «Поток 1: EXC_BAD_ACCESS (код = 1, адрес = 0x0)» при вызове glCreateShader

#c #macos #opengl #glfw

#c #macos #opengl #glfw

Вопрос:

Я пытаюсь скомпилировать шейдерную программу, но получаю сообщение об ошибке во время выполнения, указанное выше. Я некоторое время пытался выяснить, почему это происходит и что это значит, но я довольно застрял.

Вот соответствующий исходный код:

Main.cpp:

 #include <glad/glad.h>
#include <GLFW/glfw3.h>

#include "shader.hpp"

void initGLFW() {
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    #ifdef __APPLE__
        glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    #endif
}

GLFWwindow* createWindow(int width, int height) {
    GLFWwindow* window = glfwCreateWindow(width, height, "LearnOpenGL", NULL, NULL);
    if (window == NULL) {
        throw runtime_error("Failed to create GLFW window");
    }
    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    return window;
}

int main() {
    initGLFW();
    GLFWwindow* window = createWindow(WIDTH, HEIGHT);
    initGLAD();
    
    Shader sh {"vertex-shader.txt", "fragment-shader.txt"};
}
  

Shader.cpp

 unsigned int Shader::compileShader(ShaderType shaderType, const char* srcShader) {
    unsigned int shader {};
    string shaderStr {};
    if (shaderType == ShaderType::vertex) {
        shader = glCreateShader(GL_VERTEX_SHADER); // THIS IS WHERE THE RUNTIME ERROR COMES UP
        shaderStr = "Vertex";
    }
    else if (shaderType == ShaderType::fragment) {
        shader = glCreateShader(GL_FRAGMENT_SHADER);
        shaderStr = "Fragment";
    }
    glShaderSource(shader, 1, amp;srcShader, nullptr);
    glCompileShader(shader);
    
    // Check for compilation failure
    int  success;
    char infoLog[512];
    glGetShaderiv(shader, GL_COMPILE_STATUS, amp;success);
    if (!success) {
        glGetShaderInfoLog(shader, 512, nullptr, infoLog);
        ostringstream oss {};
        oss << shaderStr << " shader compilation failed.n" << infoLog << endl;
        throw runtime_error(oss.str());
    }
    
    return shader;
}

Shader::Shader(const stringamp; vertexShaderFilepath,
               const stringamp; fragmentShaderFilepath)
{
    string srcVertexShader {shaderFromFile(vertexShaderFilepath)};
    string srcFragmentShader {shaderFromFile(fragmentShaderFilepath)};
    const char* srcVS_cstr = srcVertexShader.c_str();
    const char* srcFS_cstr = srcFragmentShader.c_str();
    
    unsigned int vertexShader = compileShader(ShaderType::vertex, srcVS_cstr);
    unsigned int fragmentShader = compileShader(ShaderType::fragment, srcFS_cstr);
    
    shaderProgram = linkShaders(vertexShader, fragmentShader);
    
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
}

// More stuff in shader.cpp, I only included relevant bits of code.
  

Shader.hpp (в основном не имеет значения):

 #include <string>

using namespace std;

class Shader {
public:
    Shader(const stringamp; vertexShaderFilepath,
           const stringamp; fragmentShaderFilepath);
    void activate();
    void activateWithUniform(const stringamp; uniformName, float uniformVal);
    void activateWithUniform(const stringamp; uniformName, int uniformVal);
    
private:
    enum class ShaderType { vertex, fragment };
    
    static string shaderFromFile(const stringamp; filepath);
    static unsigned int compileShader(ShaderType shaderType, const char* srcShader);
    static unsigned int linkShaders(unsigned int shader1, unsigned int shader2);
    
    unsigned int shaderProgram {};
};
  

Вот скриншот, показывающий, какие библиотеки я связал.

Скриншот, показывающий, какую библиотеку я связываю

Я должен упомянуть, что шейдеры — это единственное, что не работает в программе — если я закомментирую шейдер, остальная часть программы выведет окно с зеленоватым фоном. Вот полный исходный код, но я надеюсь, что приведенных выше фрагментов кода достаточно, чтобы предоставить необходимую информацию.

Комментарии:

1. Как отлаживать небольшие программы

2. @S.M. wikihow.com/Be-a-Good-Person

Ответ №1:

Вы должны выбирать между GLAD и GLEW, но не использовать оба: GLEW поставляется со своим собственным набором символов для OpenGL, но вы не вызываете glewInit, поэтому они остаются равными 0x0. Либо удалите библиотеку libGLEW, либо код GLAD.

Комментарии:

1. Спасибо, я удалил библиотеку GLEW, но, к сожалению, я все еще получаю ту же ошибку во время выполнения.

2. Подключите отладчик и отредактируйте свой вопрос с помощью трассировки стека функции сбоя. (в виде текста!)