几个星期以前开始折腾在我的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里建构程序后运行正常。

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

  1. 要用XCode 带的llvm-g++。用clang 或 g++ 虽然能编译成功,但在链接的时候会报一大堆warning。
  2. 需要添加一个-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 程序的更多相关文章

  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. linux驱动系列之makefile

    在linux环境下做嵌入式无论是编写应用程序还是驱动程序等等,都需要用make来进行程序的编译,就需要学会自己编写Makefile.Makefile主要的作用有3点:1.决定编译哪些文件 2.怎样编译 ...

  2. python 知识 rstrip,strip,lstrip

    rstrip,strip,lstrip 作用:去除字符串中的空格或指定字符 一.默认用法:去除空格str.strip()  : 去除字符串两边的空格str.lstrip() : 去除字符串左边的空格s ...

  3. Atmel Studio 6.0 重新安装

    问题描述:        Atmel Studio 6.0 重新安装     在卸载Atmel Studio6.0之后,重新安装Atmel Studio6.0软件,提示cannot find one ...

  4. Machine Learning for Developers

    Machine Learning for Developers Most developers these days have heard of machine learning, but when ...

  5. hdu 4664 Triangulation 博弈论

    看到这题时,当时还不会做,也没搞懂sg函数,于是狠狠的钻研了下博弈论,渐渐的知道了sg函数…… 现在在来做这题就很容易了,1A 打表容易发现在80左右的时候就出现循环节了 代码如下: #include ...

  6. SSH hibernate 使用时最好添加访问数据库的编码

    SSH hibernate 使用时最好添加访问数据库的编码 如下所示:第13行为设置hibernate访问数据库的编码(&是&的转义序列) <!DOCTYPE hibernate ...

  7. 李洪强漫谈iOS开发[C语言-012]-C语言基本数据类型

    // //  main.m //  08 - 基本数据类型 // //  Created by vic fan on 16/7/16. //  Copyright © 2016年 李洪强. All r ...

  8. utf-8转换为ansi和修改文件名的批处理(可解决source insight中文注释乱码问题)

    source insight中文乱码有两个原因,一个是source insight的设置不正确.另外一个原因是源文件是utf-8格式的. 最近在工作中用source insight 查看jsp文件.j ...

  9. C++ eof()函数相关应用技巧分享

    C++编程语言中的很多功能在我们的实际应用中起着非常大的作用.比如在对文件文本的操作上,就可以用多种方式来实现.在这里我们介绍的C++ eof()函数就是其中一个比较常用的基本函数. 在使用C/C++ ...

  10. JVM运行机制

    JVM启动流程