我正在尝试在 OS X 10.8.4 上的 XCode(版本 4.6.3)中使用 GLFW(版本 3.0.2)和 GLEW(版本 1.10.0)运行一个简单的 OpenGL 程序。整个代码如下所示。
#include <GLFW/glfw3.h>
#include <OpenGL/OpenGL.h>
#include <iostream>
using namespace std;
void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
void InitGL()
{
glClearColor(1, 0, 0, 1);
}
void ErrorFunc(int code, const char *msg)
{
cerr << "Error " << code << ": " << msg << endl;
}
int main(void)
{
GLFWwindow* window;
/* Report errors */
glfwSetErrorCallback(ErrorFunc);
/* Initialize the library */
if (!glfwInit())
return -1;
/* Window hints */
glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint (GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Initialize OpenGL */
InitGL();
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
RenderScene();
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
其中大部分直接来自 GLFW 的文档。只有渲染函数和 GLEW 初始化是我的。我为 OpenGL、Cocoa 和 IOKit 添加了框架,并与 libGLEW.a 和 libglfw3.a 链接。该程序编译成功,但在尝试执行 GLEW 应该处理的功能时似乎崩溃了。在这里,程序在glClearBufferfv
. 如果我将其注释掉,我会得到一个黑色背景的窗口。我的猜测是 GLEW 秘密地不起作用,因为它没有报告任何错误,但似乎根本没有做它的工作。
XCode 向我抛出的确切错误消息是error: address doesn't contain a section that points to a section in a object file
错误代码EXC_BAD_ACCESS
。如果我glClearBufferfv
用glClearColor
程序替换不会崩溃,但实际上应该是红色时仍然有黑色背景。查询时,OpenGL 返回版本字符串2.1 NVIDIA-8.12.47 310.40.00.05f01
,这解释了为什么对较新函数的调用不起作用,但 GLEW 不应该设置正确的 OpenGL 上下文吗?此外,GLFW 的文档说他们自 GLFW 2.7.2 以来一直在创建 OpenGL 3+ 上下文。我真的不知道该怎么办。