GLEW 1.10.0分段错误

时间:2013-12-29 09:49:27

标签: c++ linux opengl glew glfw

使用GLEW 1.10.0时,为什么会出现分段错误? (我在问题的底部提供了我的系统的详细信息。)

我下载并编译了GLEW。编译(make all)和安装(sudo make install.all)工作并且不显示错误。 GLEW lib安装在/usr/lib64/libGLEW.so.1.10.0中。

我创建了一个使用GLEW和glfw3(3.0.3)的简单OpenGL测试程序(见下文)。当程序使用已安装的GLEW lib时,会发生分段错误。当我在我的测试程序中使用GLEW源代码时,该程序可以正常工作。

但是,如果我加载着色器然后使用glGetProgramInterfaceiv查询已编译的OpenGL程序,我再次遇到分段错误。


详细说明:

时发生分段错误
  1. 运行glewinfo
  2. 运行visualinfo
  3. 测试程序(详情如下)
  4. 调用glGetProgramInterfaceiv(详情如下)
  5. 使用gdb

    对glewinfo进行堆栈跟踪
    #0  0x00007ffff6d5fca0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
    #1  0x00007ffff51b32f6 in __driCreateNewScreen_20050727 () from /usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
    #2  0x00007ffff7557c92 in ?? () from /usr/lib64/libGL.so.1
    #3  0x00007ffff7553ea1 in ?? () from /usr/lib64/libGL.so.1
    #4  0x00007ffff75540ce in glXChooseVisual () from /usr/lib64/libGL.so.1
    #5  0x0000000000454883 in glewCreateContext ()
    #6  0x000000000043b224 in main ()
    

    使用gdb对Visualinfo进行堆栈跟踪

    #0  0x00007ffff6d5fca0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
    #1  0x00007ffff51b32f6 in __driCreateNewScreen_20050727 () from /usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
    #2  0x00007ffff7557c92 in ?? () from /usr/lib64/libGL.so.1
    #3  0x00007ffff7553ea1 in ?? () from /usr/lib64/libGL.so.1
    #4  0x00007ffff75540ce in glXChooseVisual () from /usr/lib64/libGL.so.1
    #5  0x000000000040237b in CreateContext ()
    #6  0x000000000040103e in main ()
    

    以下是使用已安装的GLEW库和glfw3(3.0.3)

    的测试程序
    #include <GL/glew.h> 
    #include <GLFW/glfw3.h> 
    int main()
    {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(640, 480, "Hello World", NULL,
    NULL);
    glfwMakeContextCurrent(window);
    glewInit();
    glfwTerminate();
    }
    

    编译:

    g++ -o "Basic" "main.cpp" -lglfw3 -lGLEW -lGL -lX11 -lrt -lXxf86vm -lXrandr
    

    在跑步之前./Basic我设置了

    export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64
    

    (否则它找不到位于/ usr / lib64的GLEW lib)

    该程序给出了分段错误。如果我通过eclipse或使用gdb运行程序,堆栈跟踪是:

    Thread [1] 16728 [core: 2] (Suspended : Signal : SIGSEGV:Segmentation fault)    
    0x7ffff65e5ca0  
    __driCreateNewScreen_20050727() at 0x7ffff3de52f6   
    0x7ffff7645c92  
    glXQueryVersion() at 0x7ffff763d0aa 
    _glfwInitContextAPI() at 0x40c580   
    _glfwPlatformInit() at 0x408855 
    glfwInit() at 0x404829  
    main() at main.cpp:7 0x403819   
    

    使用gdb提供backtrace

    #0  0x00007ffff65e5ca0 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
    #1  0x00007ffff3de52f6 in __driCreateNewScreen_20050727 () from /usr/lib/x86_64-linux-gnu/dri/fglrx_dri.so
    #2  0x00007ffff7980c92 in ?? () from /usr/lib64/libGL.so.1
    #3  0x00007ffff79780aa in glXQueryVersion () from /usr/lib64/libGL.so.1
    #4  0x000000000040c580 in _glfwInitContextAPI ()
    #5  0x0000000000408855 in _glfwPlatformInit ()
    #6  0x0000000000404829 in glfwInit ()
    #7  0x0000000000403819 in main ()
    

    当不使用GLEW库但使用源代码(glew.h和glew.c)时,程序可以正常工作。为此,我将第一个包含更改为

    #include <glew.h>
    

    这次连接时我使用库Xi(-lXi)。编译和链接程序的g ++命令是:

    g++ -I"./" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "main.cpp"
    g++ -I"./" -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"glew.d" -MT"glew.d" -o "glew.o" "glew.c"
    g++ -o Basic ./glew.o ./main.o -lGL -lX11 -lXrandr -lXxf86vm -lrt -lglfw3 -lXi
    

    在跑步之前./Basic我设置了

    export LD_LIBRARY_PATH=/usr/local/lib
    

    (否则我得到分段错误,因为它试图使用已安装的GLEW lib) 该程序不会抛出分段错误。该程序还使用eclipse运行。


    调用glGetProgramInterfaceiv(程序,GL_PROGRAM_OUTPUT,GL_ACTIVE_RESOURCES和&amp;输出)时的详细信息;

    对于上面的测试程序,我添加了加载顶点和片段着色器的代码。我将着色器编译成一个程序。这一切都有效。调用glGetShaderInfoLog可以工作并打印日志。当我添加一行调用glGetProgramInterfaceiv的代码时,程序会产生分段错误。使用glewExperimental = GL_TRUE;没有用。

    使用gdb时,我无法获得合适的堆栈跟踪。这就是gdb给出的:

    (gdb) backtrace
    #0  0x0000000000000000 in ?? ()
    #1  0x000000000042ec18 in main () at ../main.cpp:54
    

    操作系统详细信息:

    • Linux:3.2.0-4-amd64
    • 发行:Debian 7.3 Wheezy
    • uname -m:x86_64
    • / proc / cpuinfo - &gt; flags参数 - &gt; lm值存在

    编译器详细信息

    • g ++ --version:g ++(Debian 4.7.2-5)4.7.2

    OpenGL详细信息:

    • OpenGL提供商:Advanced Micro Devices(来自AMD Catalyst Control Center)
    • OpenGL渲染器:AMD Radeon HD 7600M系列(来自AMD Catalyst Control Center)
    • OpenGL版本:4.2.11762兼容性配置文件上下文(来自AMD Catalyst Control Center)
    • glxinfo:
    • server glx version string:1.4
    • client glx version string:1.4
    • GLX版本:1.4
    • OpenGL版本字符串:4.2.11762兼容性配置文件上下文
    • OpenGL着色语言版本字符串:4.20
    • 服务器glx供应商字符串:ATI
    • 客户端glx供应商字符串:ATI

    测试程序中使用的库的详细信息   - -lglfw /usr/local/lib/libglfw3.a 3.0.3

    • -lGL在我的系统上有2个libGL.so.1.2 - &gt; /usr/lib64/fglrx/fglrx-libGL.so.1.2和libGL.so.1.2 - &gt; /usr/lib/i386-linux-gnu/fglrx/fglrx-libGL.so.1.2

    • -lX11 /usr/lib/x86_64-linux-gnu/libX11.so.6.3.0

    • -lrt /usr/lib/x86_64-linux-gnu/librt.so - &gt; /lib/x86_64-linux-gnu/librt.so.1 - &gt; /lib/x86_64-linux-gnu/librt.so.1 - &gt; /lib/x86_64-linux-gnu/librt-2.13.so

    • -lXrandr /usr/lib/x86_64-linux-gnu/libXrandr.so.2 - &gt; libXrandr.so.2.2.0

    • -lXxf86vm /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 - &gt; libXxf86vm.so.1.0.0

    • -lXi /usr/lib/x86_64-linux-gnu/libXi.so.6 - &gt; libXi.so.6.1.0

1 个答案:

答案 0 :(得分:0)

我的直觉:原因是纯64位库和32位库之间的混淆。

关于:分段错误

如果

  1. 将libGLEW移出/ usr / lib64(例如移入/ tmp文件夹)和
  2. 然后,例如export LD_LIBRARY_PATH = / tmp(而不是export LD_LIBRARY_PATH = / usr / lib64)
  3. 然后分段错误消失(测试程序运行,glewinfo和visualinfo工作)

    / usr / lib64中的某些内容导致了这个问题。

    我遇到了这个页面AMD 13.1 64 bit drivers and the libGL.so.1 error,它解释了AMD安装程序放置libGL.so文件的位置

      

    安装程序将lib文件放在/ usr / lib64中。但是,如果你有Ubuntu,那么64位库会进入/ usr / lib。我做了以下修复我的问题。

         

    卸载驱动程序   sudo ./amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run --uninstall

         

    删除/ usr / lib64文件夹   sudo rm -Rf / usr / lib64

         

    创建一个指向/ lib / usr的符号链接/ usr / lib64   sudo ln -s / usr / lib / usr / lib64

         

    再次安装驱动程序   sudo ./amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run --force

         

    重新启动   sudo reboot

    我不确定这个符号链接是不是一个好主意......


    关于:glGetProgramInterfaceiv (GLAPI/glGetProgramInterface)

    失败,因为它只能从OpenGL&gt; = 4.3获得。我的卡是4.2。运行glewinfo也揭示了这一点:

    GL_ARB_program_interface_query:                                MISSING 
    -------------------------------
    glGetProgramInterfaceiv:                                     MISSING
    glGetProgramResourceIndex:                                   MISSING
    glGetProgramResourceLocation:                                MISSING
    glGetProgramResourceLocationIndex:                           MISSING
    glGetProgramResourceName:                                    MISSING
    glGetProgramResourceiv:                                      MISSING