使用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程序,我再次遇到分段错误。
详细说明:
时发生分段错误
使用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
操作系统详细信息:
编译器详细信息
OpenGL详细信息:
测试程序中使用的库的详细信息 - -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
答案 0 :(得分:0)
我的直觉:原因是纯64位库和32位库之间的混淆。
关于:分段错误
如果
然后分段错误消失(测试程序运行,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