GLEW 1.10.0分段故障
GLEW 1.10.0 Segmentation Fault
为什么使用GLEW 1.10.0时出现分段错误?(我在问题的底部提供了我的系统的详细信息。)
我下载并编译了GLEW。编译(make-all)和安装(sudomakeinstall.all)工作正常,没有显示任何错误。GLEW库安装在/usr/lib64/libGLEW.so.1.10.0中。
我创建了一个简单的OpenGL测试程序(见下文),该程序使用GLEW和glfw3(3.0.3)。当该程序使用已安装的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 的可视化信息堆栈跟踪
#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
跑步前/基本I设置
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更改为
#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
跑步前/基本I设置
export LD_LIBRARY_PATH=/usr/local/lib
(否则我会遇到分段错误,因为它试图使用已安装的GLEW-lib)这个程序不会抛出分段错误。该程序还使用eclipse运行。
调用glGetProgramInterfaceiv(程序、GL_program_OUTPUT、GL_ACTIVE_REOURCES和输出)时的详细信息;
在上面的测试程序中,我添加了加载顶点和片段着色器的代码。我把着色器编译成一个程序。这一切都有效。调用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++——版本: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:
- 服务器glx版本字符串:1.4
- 客户端glx版本字符串: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在我的系统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/libt.so->/lib/x86_64-linux-gnu/libt-so.1->/lib/x86_64-linux-gnu/libst-2.13.so
-lXandr/usr/lib/x86_64-linux-gnu/libXandr.so.2->libXandr.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
我的直觉:原因是纯64位库和32位库之间的混淆。
关于:分段故障
如果
- 将libGLEW从/usr/lib64中移出(例如,移动到/tmp文件夹中),然后
- 则例如导出LD_LIBRARY_PATH=/tmp(而不是导出LD_LBRARY_PATH=/usr/lib64)
然后分段故障消失(测试程序运行,glewinfo和visualinfo工作)
/usr/lib64中的某些内容导致了此问题。
我看到了这个页面AMD 13.1 64位驱动程序和libGL.so.1错误,它解释了AMD安装程序将libGL.so文件放在哪里
安装程序将lib文件放在/usr/lib64中。但是,如果您有Ubuntu,那么64位库位于/usr/lib中。我做了以下操作来解决我的问题。
卸载驱动程序sudo/amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run--卸载
删除/usr/lib64文件夹sudo rm-Rf/usr/lib64
创建指向/lib/usr的符号链接/usr/lib64sudo ln-s/usr/lib/usr/lib64
重新安装驱动程序sudo/amd-driver-installer-catalyst-13.1-legacy-linux-x86.x86_64.run--强制
重新启动sudo重新启动
我不确定这个符号链接是否是个好主意。。。
关于: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
- 分段故障(堆芯转储)矢量
- 数组的指针从不分段故障
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 分段故障 运行C++代码时出现 SIGSEGV
- 分段故障背包问题
- 分段故障 11,从类函数显示动态 C 字符串
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 在C++中,当指向删除和指向不同对象时,分段故障指针
- 分段故障说明
- 分段故障(核心转储)-不知道为什么
- 分段故障线程
- hiredis SET遇到分段故障
- 分段故障,合并排序算法
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 到达主C++之前分段故障
- 分段故障核心使用 IF流转储
- 使用向量的移动键盘排列(分段故障)
- 在二进制树插入和遍历期间,我得到了分段故障
- 分段故障在类之间返回整数
- C++分段故障BST