首页 文章

GLEW 1.10.0分段错误

提问于
浏览
0

使用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程序,我再次得到分段错误 .


细节:

分段错误发生在

  • 正在运行glewinfo

  • 正在运行visualinfo

  • 测试程序(详情如下)

  • 调用glGetProgramInterfaceiv(详情如下)

使用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提供回溯

#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和输出)时的详细信息;

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

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

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

OS详细信息:

  • Linux:3.2.0-4-amd64

  • Distro:Debian 7.3 Wheezy

  • uname -m:x86_64

  • / proc / cpuinfo - > flags参数 - > 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

  • 客户端glx版本字符串:1.4

  • GLX版本:1.4

  • OpenGL版本字符串:4.2.11762兼容性配置文件上下文

  • OpenGL着色语言版本字符串:4.20

  • server glx供应商字符串:ATI

  • 客户端glx供应商字符串:ATI

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

  • -lGL在我的系统上有2个libGL.so.1.2 - > /usr/lib64/fglrx/fglrx-libGL.so.1.2和libGL.so.1.2 - > / 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 - > /lib/x86_64-linux-gnu/librt.so.1 - > /lib/x86_64-linux-gnu/librt.so.1 - > /lib/x86_64-linux-gnu/librt-2.13.so

  • -lXrandr /usr/lib/x86_64-linux-gnu/libXrandr.so.2 - > libXrandr.so.2.2.0

  • -lXxf86vm /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 - > libXxf86vm.so.1.0.0

  • -lXi /usr/lib/x86_64-linux-gnu/libXi.so.6 - > libXi.so.6.1.0

1 回答

  • 0

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

    关于:分段错误

    如果

    • 将libGLEW移出/ usr / lib64(例如移入/ tmp文件夹)和

    • 然后,例如export LD_LIBRARY_PATH = / tmp(而不是export LD_LIBRARY_PATH = / usr / lib64)

    那么分段错误消失了(测试程序运行,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创建符号链接/ usr / lib64指向/ lib / usr sudo ln -s / usr / lib / usr / lib64再次安装驱动程序sudo ./amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run --force重启须藤重启

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


    关于:glGetProgramInterfaceiv (GLAPI/glGetProgramInterface)

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

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

相关问题