我最近买了一台mac进行跨平台开发,我遇到了一些OpenGL问题。
使用未声明的标识符'glBindVertexArray'
我正在使用glfw(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"
为什么我得到这些未定义的标识符有任何明显的错误?
干杯!
答案 0 :(得分:0)
在OS X上不需要GLEW。所有支持的OpenGL函数都在标准开发环境中包含的头文件中声明。如果您想查看哪些头文件及其包含的内容,请在此答案中解释头文件的确切位置:Where are the OpenGL header files located on MacOSX?。您通常不必担心路径名称,如果您使用<OpenGL/gl3.h>
这样的名称包含它,编译器会自动找到正确的名称。
对于GLFW,您在问题中有正确的包含序列:
#define GLFW_INCLUDE_GLCOREARB
#include <GLFW/glfw3.h>
根据评论中的讨论,您遗漏的是,在您加入GLFW_INCLUDE_GLCOREARB
之前,您需要<GLFW/glfw3.h>
定义每次。
当您开发跨平台代码时,每个包含OpenGL调用的源文件中的每个平台都需要条件包含是很麻烦的。让生活更轻松的简单方法是将系统依赖包含在单个标头中,然后在源文件中包含该标头。这隔离了系统依赖性,并使以后更容易添加平台。
例如,您可以定义一个名为gl_includes.h
的标头,其中包含与系统相关的OpenGL包含,就像您在代码中一样:
#ifdef WIN32
#include ...
#endif
#ifdef ...
#include ...
#endif
然后,在所有源文件中,您只包含此标题:
#include "gl_includes.h"
答案 1 :(得分:0)
如果您使用的是CC=clang++
,请在参数中添加-isysroot
示例,在我的makefile中:
CC=clang++
CFLAGS:= -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk