在 MacOS 上编译链接 OpenGL 程序
几个星期以前开始折腾在我的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
打完收工。
在 MacOS 上编译链接 OpenGL 程序的更多相关文章
- macOS上实现Qt应用程序做文件关联打开
一.背景介绍 用Qt开发的应用程序要实现文件关联,双击时用默认关联的程序打开文件,在Windows上这个功能非常容易实现.Windows应用程序在安装的时候可以在注册表中写入相关的键值对.打开文件的时 ...
- vc如何编译链接opengl库
强烈推荐的一篇强大的OpenGl学习博文OpenGL入门学习 vc2012如何链接opengl库? 首先,我们需要下载opengl的库文件,http://pan.baidu.com/s/1kTsjkZ ...
- 在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 ...
- macOS 上编译 Dynamips
Dynamips 是一个Cisco 路由器模拟软件. 安装过程: git clone git://github.com/GNS3/dynamips.git cd dynamips mkdir buil ...
- 在64位Ubuntu上编译32位程序常见错误
问 题1: 找不到头文件 asm/errno.h 解决办法 : [/usr/lib/gcc$ ]sudo ln -s x86_64-linux-gnu/asm asm 问题2:找不到gcc ...
- 解决Qt在openSUSE上编译出现“cannot find -lGL”错误
在openSUSE上编译QT5.4程序出现“cannot find -lGL”,就连example都无法通过编译.QT是在官网下的最新的安装包. 大体意思是,缺少qt运行时所需要的openGL库.决绝 ...
- 利用gcc编译链接时出现 ‘undefined reference to `std::ios_base::Init::Init()’ 解决
一般编译链接c++程序最好使用g++,若有如上的报错信息,需要在gcc后加上 -lstdc++ eg: gcc test.c -lstdc++ gcc和g++都是GNU的一个编译器. g++:后缀.c ...
- iOS和macOS上的Message-ID和Mail.app深度链接
如何在iOS上通过电子邮件进行无缝的“无密码”身份验证. Apple平台上的邮件和日历集成 在macOS和iOS上查看电子邮件时,邮件会在[检测到的日期和时间]下划线 .您可以与他们互动以创建新的日历 ...
- 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 ...
随机推荐
- 微软Hololens设备 浅分析
微软Hololens的定位是一款MR 设备(Mixed reality).MR与AR的不同我认为是MR能够将真实环境的场景信息与虚拟对象进行完美的融合,它是基于SLAM(SimultaneousLoc ...
- String类中的equals()方法
在Java中,每一个对象都有一个地址空间,在这空间保存着这个对象的值. equals 比较的是值,==比较的地址以及值. 01: public class StringExample02: {03: ...
- 1199: [HNOI2005]汤姆的游戏 - BZOJ
Description 汤姆是个好动的孩子,今天他突然对圆规和直尺来了兴趣.于是他开始在一张很大很大的白纸上画很多很多的矩形和圆.画着画着,一不小心将他的爆米花弄撒了,于是白纸上就多了好多好多的爆米花 ...
- uva 1377
比较不错的一个题,关键是理解状态转移 #include<algorithm> #include<cstdio> #include<cstring> #include ...
- hdu 4403
水水的dfs #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath& ...
- ural 1066 uva 1555
好吧 竟然因为编译器的问题不过 到底有什么区别 ???? 可以推出公式Hi = (i-1)H2 +(i-1)(i-2)-(i-2)*H1 因为所有的Hi都要大于零 Hn要最小 即存在Hi=0 ...
- 设置UINavigation的背景图片和背景颜色
//通过背景图片来设置背景 float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; UIImage * ...
- 数据聚合 & 分组:新一代系统监控的核心功能
遥想 2015 年 8 月 17 日,Cloud Insight 还在梳理功能原型,畅想 Cloud Insight 存在的意义:为什么阿里云用户需要使用 Cloud Insight 来加强管理. 而 ...
- VIM的高级使用
VIM的高级使用 转:http://www.cnblogs.com/itech/archive/2012/02/22/2363111.html 1)一些常用的Vim配置,在~/.vimrc中 syn ...
- 几款开源的图形界面库(GUI Libraries)
SmartWin++ 遵循BSD许可协议的C++ GUI库,建立在Windows API之上,但仍可以通过使用WineLib在Linux/xNix上使用.也支持Pocket PC和基于Windows ...