为Mac OSX构建glew

20
我一整天都在努力让我的简单引擎在Mac上运行。SDL已经可以工作了,现在唯一的问题是OpenGL。这个引擎使用的是现代OpenGL(基于着色器),所以需要GLEW。我尝试了从fink到MacPorts的各种安装方法,但都没有成功。
最成功的方法是从源代码构建它。首先我收到了一个错误消息,说“GL/glu.h”文件或目录不存在。于是我把包含文件的名称改为“OpenGL/glu.h”,问题就解决了。但现在我遇到了这个错误:unknown option: -shared。我完全陷入了困境。
如果有人知道如何进行静态构建,那也行。

我建议使用像macports、fink、homebrew这样的端口系统,因为作者已经完成了将构建过程移植到OSX的工作。在这种情况下,OSX链接器不理解-shared,所以你需要使用它的等效方式,并且还会有其他几个问题。 - mmmmmm
正如我所说,我使用了Macports,并且它显示安装成功,但是没有安装任何东西。 - DavidColson
1
sudo port install glew 给出了什么错误? - mmmmmm
它并没有成功,我只是找到了如何安装东西,但我仍然无法与glew链接。 - DavidColson
1
应该只需要-L/opt/local/lib和-lglew(假设库是libglew.dylib),因此与自己构建时所做的不同,只需使用不同的目录即可。 - mmmmmm
1
我所要做的就是在Codeblocks中指定/opt/local/include作为搜索目录,然后它就可以工作了! - DavidColson
7个回答

32
你可以使用 Homebrew 来为你完成这项工作:
brew install glew

2
那接下来呢?我对这个完全是新手,正在尝试让它工作。安装已经完成,但我仍然不知道接下来该做什么。 - Rafael Eyng
2
@RafaelEyng,在此之后,请在main.cpp中编写您的代码,然后使用clang ++ main.cpp -lGLEW -framework OpenGL -o <EXECUTABLE_FILE>进行编译(如果您使用其他库,则可以添加-lglfw3 -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo)。 - Ankit Panda

16
引擎使用现代OpenGL(基于着色器),因此需要GLEW。 GLEW并非使用现代OpenGL功能的先决条件。它是一种加载扩展功能的方法,而不是唯一的方法。您使用的是MacOS X,因此扩展系统对您来说没有多大用处,因为所支持的OpenGL版本完全由操作系统和可用框架决定。苹果公司自己开发OpenGL驱动程序,并提供的扩展仅限于在OpenGL规格中找不到的功能(即供应商特定和EXT)。您所需要的只是足够新的OpenGL框架版本。2006年以后发布的任何MacOS X都可以做到。

3
一个包含GLEW的程序如何移植到OS X上编译? - Efren
2
@Efren:检查__APPLE__预处理器宏,仅当该宏未定义时才包含GLEW头文件。对于已定义__APPLE__的情况,定义(空)宏将glew…函数调用转换为无操作。 - datenwolf
那么如果不包含GLEW头文件,有哪些苹果头文件可用呢?我的意思是,旧程序实际上正在调用这些函数。 - Efren
@Efren:只需使用OpenGL/GL.h,无需额外的工作。这样做的好处是,不必处理函数指针加载。缺点是,所使用的OpenGL版本立即对您的程序所需的MacOS X版本设置了硬性最低要求。 - datenwolf
谢谢,问题在于旧程序还需要GLUT。 - Efren

7

更新20180912 - 不要使用GLEW。这真的不值得麻烦...


我已经使用以下方式从源代码安装了GLEW:

make GLEW_DEST="$HOME/local" OPT="-march=core2 -O2" install.all

您的优化和目标可能有所不同。这将在$HOME/local/lib中产生libGLEW.a、libGLEWmx.a及其dylib对应项。子目录pkgconfig还将包括glew.pc。GLEW并不总是与其他软件兼容。需要设置全局变量,例如glewExperimental,以及需要小心处理其他头文件的包含顺序:<OpenGL/gl3.h><glfw.h>等。

如果我可以提供一些建议-忘记SDL,转而考虑像下面这样的东西,以进行纯净的、现代的OS X GL编程:

#if defined (__APPLE_CC__)
#include <OpenGL/gl3.h>
#else
#include <GL/gl3.h>       /* assert OpenGL 3.2 core profile available. */
#endif

#define GLFW_INCLUDE_GL3  /* don't drag in legacy GL headers. */
#define GLFW_NO_GLU       /* don't drag in the old GLU lib - unless you must. */

#include <GL/glfw.h>      /* simple and easy to use. omit legacy GL. */

安装GLFW也很容易:

> env PREFIX="$HOME/local" CFLAGS="-march=core2 -O2" make cocoa cocoa-dist-install

同样,你的设置可能有所不同。


20160412: 我对SDL的评论已经过时,正如其他人所指出的那样。特别是如果你正在开发另一个引擎的话。我认为glfw3是在OSX上制作现代OpenGL应用程序的更简单方法。它非常优秀且代码维护得很好,专注于GL和事件处理。显然,从“引擎”的角度来看,SDL2提供了可移植的扩展视频API、音频API、线程API等。但是,随着C11和C++11的出现,即使是线程API抽象层也可能是多余的。

GLEW存在问题,因为它无法处理多个上下文而需要用户进行大量干预。这对于OSX来说不是问题,因为它提供了核心配置文件API,不需要加载“函数点”。我IRC,X(DRI?)上的GL也有这个功能,但我可能是错的。还有其他的加载器。我仍然在等待一个能够统治它们所有的加载器,它可以确保为多个上下文加载不同的函数指针,并使用线程本地存储(甚至是pthread key)进行正确的分派,可以从Khronos或其他人的最新gl.xml生成...


20180912

我认为目前最简单的方法是使用GLFW来提供上下文,并使用GLAD来解析GL函数指针。唯一的缺点是没有有效地管理多个GL上下文。这是GLFW在其演示中目前正在使用的... 我会完全忘记GLEW。


7
“忘记SDL进行现代OpenGL编程”这个评论已经过时了。SDL2可以让你指定OpenGL上下文的版本。 - Michael Labbé
1
作为一个使用OpenGL和SDL的业余项目开发者,要深入了解OpenGL的整个领域是很困难的。我正在使用SDL2与OpenGL,并尝试首次加载着色器。然而,很难确定我正在使用哪个版本的OpenGL。你(@mlabbe或其他人)能否推荐一些有帮助的资源?大多数我找到的都是狭窄的教程。 - michaelgulak
我建议您查看与您所针对的OpenGL版本相对应的Open GL超级宝典修订版。它专注于核心配置文件,消除了旧调用。这比随意谷歌搜索要更有效。http://docs.gl/也很有用,可以将调用匹配到相应的版本。 - Michael Labbé
这里的示例头文件很有帮助...但是对于2016年macOS 10.11上的Xcode,我必须使用最后一行的"#include <GLFW/glfw3.h>",而不是在此处列出的"#include <GL/glfw.h>"。 - miker

3

MacPorts可以为您安装这些库及其依赖项:

sudo port install glew +universal
sudo port install libsdl +universal

在构建游戏时,最好使用g++进行构建和链接步骤; 您只需要引用/opt/local,就可以找到由MacPorts安装的头文件和库。 如果需要,您还可以静态链接.a文件:

g++ -c -O3 -I/opt/local/include main.cpp -o main.o
g++ main.o /opt/local/lib/libSDL.a /opt/local/lib/libSDLmain.a /opt/local/lib/libGLEW.a -o mygame

如果你是在命令行中进行构建,我建议使用Makefile,并使用make进行构建。 点击此处学习如何使用Makefile

2

以上答案都没有给我我所需要的:快速设置带有静态Glew依赖项的Xcode项目的方法。

  1. 从这里下载GLEW源代码http://glew.sourceforge.net/
  2. 解压目录并从根目录执行以下命令
$sudo make install 

(这将安装.dylib,如果您想链接动态位于lib/)。您需要安装CMake才能运行上述命令。如果尚未安装,则可以使用以下方式进行安装

brew install cmake
  1. 将/usr/local/lib/中的.a静态库复制到您的XCode项目中
  2. 在Xcode构建设置中更新您的目标的“Header Search Paths”,以包括头文件(通常放置在/usr/local/include中)。或者只需将头文件复制到您自己的项目中。

这应该是正确的答案。在 Mac M1 上运行良好。 - Mahesh Jamdade

1
我建议您前往http://glew.sourceforge.net并将ZIP文件直接下载到Mac上。然后进入Finder并键入glew.h以查看文件,控制单击它,获取信息并复制文件的路径。然后进入包含#include <GL/glew.h>依赖项的相应程序文件(例如commons.h),并将其更改为:
#include <path/to/file/that/you/just/copied/glew.h>  

然后,尝试重新编译您的程序,这次您不应该收到任何GLEW错误。


你真的不应该这样做。 - Samie Bencherif

0

也许你可以尝试这个命令 brew install --build-from-source glew


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接