几个星期以前开始折腾在我的MBA上写 OpenGL 小程序。我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接。网上查了一下,MacOS上的OpenGL编译选项跟 windows 和 Linux 上的很不一样, 不是用 -I 来指定头文件搜索路径,用-l来链接库文件。MacOS SDK把一些应用库包装成了所谓的“Framework”,其中就包括OpenGL,GLUT 和 Cocoa。所以MacOS下的OpenGL程序(我用到了GLUT)是这样编译的:

  1. g++ -framework OpenGL -framework GLUT -framework Cocoa helloworld.cpp -o helloworld

-framework 选项兼具了-I 和 -l 的功能。但是当我使用上面的命令行编译我的程序的时候,编译器报错说:

  1. In file included from helloworld.cpp::
  2. /System/Library/Frameworks/GLUT.framework/Headers/glut.h::: error: OpenGL/gl.h: No such file or directory
  3. /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 下的内容如下:

  1. Libraries OpenGL PlugIns Resources Versions

唯独没有Headers

google建议重装XCode。但重装之后仍然如此。不得已用XCode 重新创建了一个工程,然后在编译选项里添加framework 支持——这时候我发现,XCode 添加的OpenGL framework 指向的不是 /System/Library/Frameworks/OpenGL.framework,而是指向位于XCode 安装路径下的另一个目录:

  1. /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10..sdk/System/Library/Frameworks/OpenGL.framework

在XCode里建构程序后运行正常。

那如何在命令行中编译呢?经过几次试验,我发现了两个要点:

  1. 要用XCode 带的llvm-g++。用clang 或 g++ 虽然能编译成功,但在链接的时候会报一大堆warning。
  2. 需要添加一个-F 参数,指示编译器到哪里去搜索frameworks。

最后的编译命令行看起来像这样:

  1. /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

打完收工。

在 MacOS 上编译链接 OpenGL 程序的更多相关文章

  1. macOS上实现Qt应用程序做文件关联打开

    一.背景介绍 用Qt开发的应用程序要实现文件关联,双击时用默认关联的程序打开文件,在Windows上这个功能非常容易实现.Windows应用程序在安装的时候可以在注册表中写入相关的键值对.打开文件的时 ...

  2. vc如何编译链接opengl库

    强烈推荐的一篇强大的OpenGl学习博文OpenGL入门学习 vc2012如何链接opengl库? 首先,我们需要下载opengl的库文件,http://pan.baidu.com/s/1kTsjkZ ...

  3. 在64位linux上编译32位程序 for i386 intel

    编辑中 # ld -V GNU ld version 2.15.92.0.2 20040927 Supported emulations: elf_x86_64 elf_i386 i386linux ...

  4. macOS 上编译 Dynamips

    Dynamips 是一个Cisco 路由器模拟软件. 安装过程: git clone git://github.com/GNS3/dynamips.git cd dynamips mkdir buil ...

  5. 在64位Ubuntu上编译32位程序常见错误

    问       题1: 找不到头文件 asm/errno.h 解决办法 : [/usr/lib/gcc$ ]sudo ln -s x86_64-linux-gnu/asm asm 问题2:找不到gcc ...

  6. 解决Qt在openSUSE上编译出现“cannot find -lGL”错误

    在openSUSE上编译QT5.4程序出现“cannot find -lGL”,就连example都无法通过编译.QT是在官网下的最新的安装包. 大体意思是,缺少qt运行时所需要的openGL库.决绝 ...

  7. 利用gcc编译链接时出现 ‘undefined reference to `std::ios_base::Init::Init()’ 解决

    一般编译链接c++程序最好使用g++,若有如上的报错信息,需要在gcc后加上 -lstdc++ eg: gcc test.c -lstdc++ gcc和g++都是GNU的一个编译器. g++:后缀.c ...

  8. iOS和macOS上的Message-ID和Mail.app深度链接

    如何在iOS上通过电子邮件进行无缝的“无密码”身份验证. Apple平台上的邮件和日历集成 在macOS和iOS上查看电子邮件时,邮件会在[检测到的日期和时间]下划线 .您可以与他们互动以创建新的日历 ...

  9. ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

    原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 作者:Daniel Roth.Steve Smith ...

随机推荐

  1. Buffer

    Buffer 我们用原有 IO 读写文件应该不会陌生了,顺带回顾一下,大致两种: 1. 在 InputStream 或 OutputStream 上读写字节或字节数组,读 InputStream 时用 ...

  2. unity3d学习笔记(十九)--ngui制作3d人物头顶的头像和血条

    原地址:http://blog.csdn.net/lzhq1982/article/details/18793479 本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. htt ...

  3. Android 如何切换到 Transform API?

    摘要: 如果你的 Android 构建中涉及到字节码插装(bytecode instrumentation),或者应用中提供了进行插装的插件,并希望它能支持 Instant Run,那么你必须切换到 ...

  4. Generating Huge reports in JasperReports

    There are certain things to care while implementing the Jasper Reports for huge dataset to handle th ...

  5. POJ3297+map字符串处理

    简单的字符串处理题. 要注意细节! 附数据两组: ABCC abc ae AAA abc AAAA abc A a B a C a /* */ #include<stdio.h> #inc ...

  6. iOS利用HealthKit框架从健康app中获取步数信息

    微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食. 统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为 ...

  7. PHP基础语法2

    数组 PHP有两种数组:索引数组.关联数组. 函数 自定义函数 自定义函数通过将一组代码封装起来,使代码进行复用,程序结构与逻辑更加清晰 返回值 使用return关键字可以使函数返回值,可以返回包括数 ...

  8. 使用session技术来实现网上商城购物车的功能

    首先.简单的了解session和cookie的区别: 一.session和cookie的区别: session是把用户的首写到用户独占的session中(服务器端) cookie是把用户的数据写给用户 ...

  9. Fibonacci sequence 求余数

    #include <iostream> using namespace std; int f(int n); int main() { int n; cin>>n; doubl ...

  10. Qt: 读写二进制文件(写对象, 原始数据等)

    #include <iostream>#include <QFile>#include <QImage>#include <QMap>#include ...