GLEW 2.0 的 glewInit 段错误

glewInit Segfault with GLEW 2.0

我正在尝试编写一个简单的程序,该程序仅使用 GLEW 2.0 和 GLFW 3 打开 window,但遇到了段错误...

这是我的来源:

#include <stdio.h>                                                      
#include <GL/glew.h>                                                    
#include <GLFW/glfw3.h>                                                 

int main(int argc, char **argv) {                                       
    const int height = 100;                                             
    const int width = 100;                                              

    if (!glfwInit()) {                                                  
        printf("Glfw failed to init\n");                                
        return -1;                                                      
    }                                                                   

    // 4x antialiasing                                                  
    glfwWindowHint(GLFW_SAMPLES, 4);                                    

    // We want OpenGL 3.3                                               
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);                      
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);                               

    // We don't want the old OpenGL                                     
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);      

    GLFWwindow* window;                                                 
    window = glfwCreateWindow(width, height, "Tutorial 01", NULL, NULL);

    if (window == NULL) {                                               
        printf("GLFW Failed to open a window. "                         
               "Intel GPUs don't support 3.3\n");                       
        glfwTerminate();                                                
        return -1;                                                      
    }                                                                   

    glfwMakeContextCurrent(window);                                     
    glewExperimental = 1;                                               
    if (glewInit() != GLEW_OK) {                                        
        printf("GLEW Failed to initialize.\n");                         
        return -1;                                                      
    }                                                                   

    glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);                

    do {                                                                
        glfwSwapBuffers(window);                                        
        glfwPollEvents();                                               

    } while( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&      
    glfwWindowShouldClose(window) == 0 );                               
}                    

我用

编译这个
gcc test.c -g -lGLEW -lglfw -o test

并在 运行 程序上收到段错误。使用 gdb,对段错误的回溯给出

0  0x0000000000000000 in ?? ()
1  0x00007ffff7ba02a7 in glxewInit () from /usr/lib64/libGLEW.so.2.0
2  0x00007ffff7ba87a3 in glewInit () from /usr/lib64/libGLEW.so.2.0
3  0x0000555555554bd4 in main (argc=1, argv=0x7fffffffdf18) at test.c:39

我在 Ubuntu 17.04,我安装了 glew/glfw Ubuntus pacakge manager

sudo apt-get install libglew2.0 libglew-dev libglfw3 libglfw3-dev

我正在学习本教程 here。如果有什么不同的话,我没有桌面管理器或合成器 运行。我正在使用 i3wm。但是,当 运行 与 compton 合成器一起使用时,段错误仍然会发生。

最后,为了让我可以提供一些额外的信息,lddtest 的链接库显示为

linux-vdso.so.1 =>  (0x00007ffc44ce9000)
libGLEW.so.2.0 => /usr/lib64/libGLEW.so.2.0 (0x00007f8e53dc9000)
libglfw.so.3 => /usr/lib/x86_64-linux-gnu/libglfw.so.3 (0x00007f8e53b86000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e537bf000)
libGL.so.1 => /usr/lib/nvidia-375/libGL.so.1 (0x00007f8e5351b000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8e53313000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8e53008000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8e52e04000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f8e52acb000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8e528ad000)
libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f8e526a2000)
libXinerama.so.1 => /usr/lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f8e5249f000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f8e52297000)
libXcursor.so.1 => /usr/lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f8e5208d000)
/lib64/ld-linux-x86-64.so.2 (0x000055e0ef28b000)
libGLX.so.0 => /usr/lib/nvidia-375/libGLX.so.0 (0x00007f8e51e5d000)
libGLdispatch.so.0 => /usr/lib/nvidia-375/libGLdispatch.so.0 (0x00007f8e51b8f000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f8e5196d000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f8e5175b000)
libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f8e5154f000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f8e51349000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f8e51145000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f8e50f3f000)

感谢您的帮助。

There is a bug report 说 GLEW 的核心配置文件在 2.0.0 之前被破坏了。

因此,您应该更新 GLEW。如果这不起作用,请通过将 GLFW_OPENGL_CORE_PROFILE 标志替换为 GLFW_OPENGL_COMPAT_PROFILE 来切换到兼容性配置文件。