OpenGL 函数未定义 OSX

Posted

技术标签:

【中文标题】OpenGL 函数未定义 OSX【英文标题】:OpenGL functions not defined OSX 【发布时间】:2014-07-13 18:17:25 【问题描述】:

我最近买了一个mac做一些跨平台的开发,我在OpenGL上遇到了一些问题。

使用未声明的标识符“glBindVertexArray”

我将 glfw3 (glfw3.h) 与 glew (glew.h) 一起使用,这就是我将它包含在代码中的方式:

#ifdef WIN_32
#include <glew.h>
#endif
#ifdef __APPLE__
#include <gl/glew.h>
#endif

#define GLEW_STATIC

#define GLFW_INCLUDE_GLCOREARB

#include "glfw3.h"

关于为什么我得到这些未定义的标识符有任何明显的错误吗?

【问题讨论】:

在 OS X 上不需要 GLEW。它具有支持的 OpenGL 版本的所有头文件和库。如果您只是删除 &lt;gl/glew.h&gt; 的包含,它是否有效? 抱歉回复晚了。不幸的是,删除 GLEW 后它不起作用。很高兴知道它不是必需的。 很奇怪。这是几天前才出现的:***.com/questions/24664722/…。对于该海报,它在添加 GLFW_INCLUDE_COREARB 定义后起作用。 啊,我需要把 GLFW_INCLUDE_GLCOREARB 放在 glfw3 的每个包含前面吗?还是只是第一个? 嗯,这似乎解决了它,听起来对吗? 【参考方案1】:

在 OS X 上不需要 GLEW。所有支持的 OpenGL 函数都在标准开发环境中包含的头文件中声明。如果您想查看存在哪些头文件以及它们包含的内容,则此答案中解释了头文件的确切位置:Where are the OpenGL header files located on MacOSX?。您通常不必担心路径名,如果您将路径名包含在 &lt;OpenGL/gl3.h&gt; 之类的名称中,编译器会自动找到正确的路径名。

对于 GLFW,您的问题中有正确的包含顺序:

#define GLFW_INCLUDE_GLCOREARB
#include <GLFW/glfw3.h>

根据 cmets 中的讨论,您缺少的是在包含 &lt;GLFW/glfw3.h&gt; 之前,您需要 每次 定义 GLFW_INCLUDE_GLCOREARB

当您开发跨平台代码时,需要在每个包含 OpenGL 调用的源文件中对每个平台进行条件包含,这样维护起来很麻烦。让生活更轻松的一种简单方法是将系统相关的包含保留在单个标头中,然后将该标头包含在源文件中。这样可以隔离系统依赖关系,并且可以更轻松地例如稍后添加平台。

例如,您可以定义一个名为 gl_includes.h 的标头,其中包括系统相关的 OpenGL 包含,就像您在代码中一样:

#ifdef WIN32
#include ...
#endif

#ifdef ...
#include ...
#endif

然后,在您的所有源文件中,您只包含此标头:

#include "gl_includes.h"

【讨论】:

【参考方案2】:

如果您使用的是CC=clang++,请将-isysroot 添加到您的论点中

例如,在我的 makefile 中:

CC=clang++
CFLAGS:= -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk

【讨论】:

以上是关于OpenGL 函数未定义 OSX的主要内容,如果未能解决你的问题,请参考以下文章

将 OSX 更新为“El Capitan”后未定义的函数 mcrypt

SDL2 丢失 OpenGL 上下文或未定义函数

OpenGL 纹理未按定义显示

OpenGL 项目返回未定义的引用

Opengl 未定义行为

编译opengl的未定义引用