I got linked opengl32, glew32 and glfw3. Everything is fine till run app. I inited glfw 1st, next I created context and inited glew. There's no error. Problem shows only when I'm trying to use OpenGL 3.2 functions like glBindBuffer, I got segmentation fault, but address is setted, can anybody help me?
// *** ADDED BY HEADER FIXUP *** #include <cstdio> #include <cstdlib> #include <iostream> // *** END *** #include <GLFW/glfw3.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> ////////////////////////////////////////////////////////////////////// // (c) Janusz Ganczarski // http://www.januszg.hg.pl // [email protected] ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // identyfikator obiektu programu ////////////////////////////////////////////////////////////////////// GLuint program; ////////////////////////////////////////////////////////////////////// // identyfikator obiektu bufora z danymi tablicy // wierzchołków - współrzędnymi wierzchołków kwadratu ////////////////////////////////////////////////////////////////////// GLuint vertexBuffer; ////////////////////////////////////////////////////////////////////// // identyfikator obiektu tablic wierzchołków ////////////////////////////////////////////////////////////////////// GLuint vertexArray; ////////////////////////////////////////////////////////////////////// // współrzędne wierzchołków trójkątów składających się na kwadrat ////////////////////////////////////////////////////////////////////// GLfloat position[2 * 3 * 2] = { -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f }; ////////////////////////////////////////////////////////////////////// // funkcja generująca scenę 3D ////////////////////////////////////////////////////////////////////// void DisplayScene() { // czyszczenie bufora koloru glClear ( GL_COLOR_BUFFER_BIT ); // włączenie obiektu tablic wierzchołków glBindVertexArray ( vertexArray ); // włączenie shadera //glUseProgram( program ); // narysowanie danych zawartych w tablicach wierzchołków glDrawArrays ( GL_TRIANGLES, 0, 2 * 3 ); // wyłączenie shadera glUseProgram ( 0 ); // wyłączenie obiektu tablic wierzchołków glBindVertexArray ( 0 ); } ////////////////////////////////////////////////////////////////////// // zmiana wielkości okna ////////////////////////////////////////////////////////////////////// void Reshape ( int width, int height ) { // obszar renderingu - całe okno glViewport ( 0, 0, width, height ); } ////////////////////////////////////////////////////////////////////// // inicjalizacja stałych elementów maszyny stanu OpenGL ////////////////////////////////////////////////////////////////////// void InitScene() { // kolor tła - zawartość bufora koloru glClearColor ( 1.0f, 1.0f, 1.0f, 1.0f ); // wczytanie shaderów i przygotowanie obsługi programu //AttachVertexShader( program, "kwadrat_vs.glsl" ); //AttachFragmentShader( program, "kwadrat_fs.glsl" ); // konsolidacja programu //LinkProgram( program ); // generowania identyfikatora obiektu tablic wierzchołków glGenVertexArrays ( 1, &vertexArray ); // utworzenie obiektu tablic wierzchołków glBindVertexArray ( vertexArray ); // generowanie identyfikatora obiektu bufora glGenBuffers ( 1, &vertexBuffer ); // utworzenie obiektu bufora wierzchołków (VBO) glBindBuffer ( GL_ARRAY_BUFFER, vertexBuffer ); // załadowanie danych obiektu bufora wierzchołków glBufferData ( GL_ARRAY_BUFFER, sizeof ( position ), position, GL_STATIC_DRAW ); // pobranie indeksu atrybutu wierzchołka o nazwie "inPosition" // GLuint positionLoc = glGetAttribLocation( program, "inPosition" ); // zdefiniowanie tablicy wierzchołków // glVertexAttribPointer( positionLoc, 2, GL_FLOAT, GL_FALSE, 0, NULL ); // włączenie tablic wierzchołków // glEnableVertexAttribArray( positionLoc ); // wyłączenie obiektu tablic wierzchołków glBindVertexArray ( 0 ); } ////////////////////////////////////////////////////////////////////// // usunięcie obiektów OpenGL ////////////////////////////////////////////////////////////////////// void DeleteScene() { // usunięcie obiektu programu glDeleteProgram ( program ); // usunięcie obiektu bufora wierzchołków glDeleteBuffers ( 1, &vertexBuffer ); // usunięcie obiektu tablic wierzchołków glDeleteVertexArrays ( 1, &vertexArray ); } static void error_callback ( int error, const char* description ) { fputs ( description, stderr ); } static void key_callback ( GLFWwindow* window, int key, int scancode, int action, int mods ) { if ( key == GLFW_KEY_ESCAPE && action == GLFW_PRESS ) { glfwSetWindowShouldClose ( window, GL_TRUE ); } } int main ( void ) { GLFWwindow* window; glfwSetErrorCallback ( error_callback ); if ( !glfwInit() ) { exit ( EXIT_FAILURE ); } glfwWindowHint ( GLFW_CONTEXT_VERSION_MAJOR, 3 ); glfwWindowHint ( GLFW_CONTEXT_VERSION_MINOR, 2 ); glfwWindowHint ( GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE ); glfwWindowHint ( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE ); window = glfwCreateWindow ( 800, 600, "Simple example", NULL, NULL ); if ( !window ) { glfwTerminate(); exit ( EXIT_FAILURE ); } glfwMakeContextCurrent ( window ); GLenum err = glewInit(); if ( GLEW_OK != err ) { exit ( 1 ); } glfwSetKeyCallback ( window, key_callback ); InitScene(); while ( !glfwWindowShouldClose ( window ) ) { int width, height; glfwGetFramebufferSize ( window, &width, &height ); DisplayScene(); glfwSwapBuffers ( window ); glfwPollEvents(); } glfwDestroyWindow ( window ); glfwTerminate(); exit ( EXIT_SUCCESS ); }
glew.hbefore the GLFW header as specified in their FAQ (glfw.org/faq.html#215__can_i_use_glew_with_glfw). I'm actually surprised your code compiles since you call GLEW function without having the header included...