几个星期以前开始折腾在我的MBA上写 OpenGL 小程序。我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接。网上查了一下,MacOS上的OpenGL编译选项跟 windows 和 Linux 上的很不一样, 不是用 -I 来指定头文件搜索路径,用-l来链接库文件。MacOS SDK把一些应用库包装成了所谓的“Framework”,其中就包括OpenGL,GLUT 和 Cocoa。所以MacOS下的OpenGL程序(我用到了GLUT)是这样编译的:
g++ -framework OpenGL -framework GLUT -framework Cocoa helloworld.cpp -o helloworld
-framework 选项兼具了-I 和 -l 的功能。但是当我使用上面的命令行编译我的程序的时候,编译器报错说:
In file included from helloworld.cpp::
/System/Library/Frameworks/GLUT.framework/Headers/glut.h::: error: OpenGL/gl.h: No such file or directory
/System/Library/Frameworks/GLUT.framework/Headers/glut.h::: error: OpenGL/glu.h: No such file or directory
我稍微研究了一下,发现除了OpenGL之外的其他framework,在/System/Library/Frameworks/<库名>.framework 下都有一个Headers 目录,里面放着必要的头文件。唯独OpenGL 不是这样。/System/Library/Frameworks/OpenGL.framework 下的内容如下:
Libraries OpenGL PlugIns Resources Versions
唯独没有Headers
google建议重装XCode。但重装之后仍然如此。不得已用XCode 重新创建了一个工程,然后在编译选项里添加framework 支持——这时候我发现,XCode 添加的OpenGL framework 指向的不是 /System/Library/Frameworks/OpenGL.framework,而是指向位于XCode 安装路径下的另一个目录:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10..sdk/System/Library/Frameworks/OpenGL.framework
在XCode里建构程序后运行正常。
那如何在命令行中编译呢?经过几次试验,我发现了两个要点:
- 要用XCode 带的llvm-g++。用clang 或 g++ 虽然能编译成功,但在链接的时候会报一大堆warning。
- 需要添加一个-F 参数,指示编译器到哪里去搜索frameworks。
最后的编译命令行看起来像这样:
/Applications/Xcode.app/Contents/Developer/usr/bin/llvm-g++ -F/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10..sdk/System/Library/Frameworks -framework OpenGL -framework GLUT -framework Cocoa helloworld.cpp -o helloworld
打完收工。