我的OpenGL程序是在OSX和Ubuntu 14.04的帮助下构建的。它在OSX下运行顺畅,但首先调用GL函数:glDeleteBuffers()
导致Linux下的分段错误。在Eclipse-CDT中单步执行反汇编显示:
mov 0x2200df(%rip),%rax # 0x69a840 <__glewDeleteBuffers>
mov -0x8(%rbp),%rdx
add $0x14,%rdx
mov %rdx,%rsi
mov $0x1,%edi
callq *%rax
glDeleteBuffers( 1, &normalBufferID );
问题是;跟踪寄存器值显示callq
到*%rax
是对NULL
的调用! OpenGL上下文是请求的4.3核心。
在哪种情况下会发生这样的运行时错误?
解决方案:因为我也使用GLFW。我添加了该片段:
if (glewInit() != GLEW_NO_ERROR)
{
cout << "Failed to initialize GLEW... " << endl;
return -1;
}
在glfwInit()
之后。
答案 0 :(得分:1)
我假设您正在使用代码段中的GLEW(__glewDeleteBuffers
) - 您在调用任何OpenGL函数之前是否正在调用glewInit()
?这样做会从OpenGL上下文中加载适当的OpenGL函数指针。忘记这是我将OpenGL函数指针设为null(在Windows和Linux上)的唯一方法。请参阅this tutorial under "Function Loading" for more details。
According to this answer on another question OSX并不需要glewInit()
因为OpenGL是OSX的核心部分(我没有经验),这可以解释为什么你不会在OSX上崩溃
Here is the GLEW documentation that goes over calling and checking the result of glewInit()