Mac 下的 C++ 开发环境
1. Xcode 创建 C++ 项目
Xcode (版本 4.6.3)默认支持创建 C++ 项目,步骤很简单:
打开 Xcode,新建一个项目;
在 OS X 中的 Application 中选择 Command Line Tool;
然后,在接下来的项目设置中,将 Type 设置为 C++;
如果你不需要用到 ARC 的话,取消勾选(C++ 里用不到);
这样,就在 Xcode 里创建了一个基本的 C++ 项目,Run :
需要注意的是, Xcode 默认的 C++ 编译器是 Apple LLVM Compiler(4.6.3 的版本为 4.2)也就是 Clang,默认的 C++ 标准库 为 libc++(Clang 提供的标准库),目前已经支持 C++ 11 (先前的 C++0x)标准。Xcode 同时也提供 LLVM GCC 编译器,其附带的 C++ 标准库为 libstdc++(GNU C++ 标准库)。在引入一些第三方库的时候,需要注意这些选择,如 OpenCV,可能就需要将标准库设置为 libstdc++。
IDE 由于集成了如文档、自动补全、可视化的环境配置等特性,很方便用于项目开发,但如果不用 IDE ,那怎样直接使用命令行编译 C++ 项目?很简单,直接使用编译器。
2. C++ 编译过程
在介绍编译器之前,先简单地说一下 C++ 的编译过程,以便理解编译器的工作。
编译(compiling)并不意味着只创建仅仅一个可执行文件。创建一个可执行文件是一个多级过程,其中最重要的过程是预处理(preprocessing),编译(compliation)和链接(linking)。从源代码文件到一个可执行文件的整个过程,最好的说法是 build(中文翻译的话,有叫生成,有叫编译链接,也有叫构建)。compiling 仅仅是 build 过程的一部分,但你经常会碰到许多人把 compile 指代整个过程。通常情况下,你不需要为这几个过程运行单独的命令,编译器自己会调用,如预处理器。
2.1 预处理
build 过程的第一步就是编译器运行 C 预处理器,目的是对代码文件进行文本上的处理。它会处理头文件包含指令(#include),条件编译指令(#ifdef……#endif)和宏(#define),这些指令叫做预处理指令,都以井字符 # 开头。编译器本身是绝对看不到这些预处理指令的。
比如:
- #include <iostream>
这句代码会告诉预处理指令,要把 iostream 的文件内容抓去到当前文件,你每包含一个头文件,它就会把这个头文件的内容粘贴到这个文件中,然后把 #include 指令移除。
- #define MY_NAME "Alex"
宏就是一个被其它内容(可能比较复杂)替换掉的字符串内容,此时预处理器会把下面的代码:
- cout << "Hello" << MY_NAME << endl;
展开成:
- cout << "Hello" << "Alex" << endl;
由于预处理器在编译器之前处理代码,它也可以用来移除代码——有时,你会要在代码里执行某些测试代码。你可以告诉预处理器,如果定义了某个宏,则包含某些代码。然后,如果你想执行这个代码,就定义这个宏,否则就移除掉这个宏的定义。
#include <iostream>
#define DEBUG
using namespace std;
int main()
{
int x;
int y;
cout << "Enter value for x: ";
cin >> x;
cout << "Enter value for y: ";
cin >> y;
x *= y;
#ifdef DEBUG
cout << "x: " << x << '\n' << "y: "<< y;
#endif
}
如果你不想执行变量的打印,那么只需简单注释掉 #define DEBUG 就行。
同样地,你也可以用 #ifndef 来改变条件——如果没有定义……这个方法通常用在引入多个头文件的时候。
2.2 编译
编译意味着把一个源文件(.cpp)转变成一个对象文件(object,.o 或 .obj)。
一个对象文件会把你程序里的每一个函数,封装成一个计算机处理器能理解的形式——机器指令(machine language instructions)。每一个源文件都是单独编译过的,即对象文件包含的机器代码都是编译过的源代码。比如,你有三个源文件,经过编译,生成了三个对象文件,每一个对象文件都包含了各自对应的机器代码。
但你还不能运行它们,这时候,就需要链接器了。
2.3 链接
链接(Linking),是把一堆对象文件和库(有时也可能仅仅是一个对象文件,但也需要链接)创建成一个单独的可执行文件(比如 .exe 或 .dll)。
链接器通过一种适当的格式创建一个可执行的文件,并传递每个独立的对象文件内容到一个可执行的结果。链接器也处理含有对象文件源代码之外的其它函数的引用,比如 C++ 标准库里的函数。当你调用了一个 C++ 标准库的函数,如 cout << “Hi”,你就在使用一个自己代码中没有定义的函数,它被定义在一个相关的对象文件中,但这是由编译器提供的,并不属于你。在编译时,编译器知道这个函数是有效的,因为你引出了 iostream 头文件,但由于这个函数不是 cpp 文件的一部分,编译器就会在调用树(call tree)留下一个存根(stub),链接器会遍历对象文件,针对每一个存根,它会找到正确的函数地址,然后从已链接过的其它对象文件中,用正确的地址替换掉对应的存根。
这个过程有时也叫做修正(fixup)。当你把你的程序分离成多个源文件时,你就会利用链接器来修正所有在源文件中调用过的函数。如果链接器找不到这个函数的位置,它就会生成一个 undefined function error,即便代码被编译器通过了,也不意味着代码是正确的。链接器是首先以全局的视角来探测这种错误的。
3. GCC 和 LLVM
Mac 下,如果你安装了 Xcode ,那么你就拥有了 LLVM 和 GCC 两大编译工具。
3.1 LLVM
LLVM,原来叫做 「Low Level Virtual Machine」,该项目的领导者和最初作者是 Chris Lattner 和 Vikram Adve,在 2000年的开始于 伊利诺伊大学厄巴纳-香槟分校(University of Illinois at Urbana-Champaign),2005年,Apple 雇佣了 Chris Lattner,成立了一个团队专注于 LLVM 系统在 Apple 开发系统上的各种使用。LLVM 目前是 Apple 的 Mac OSX 和 iOS 的开发工具的重要部分。
LLVM 项目是一个综合项目(umbrella project),它包括了一系列开发工具相关的技术,如:
编译器,Clang,LLVM 原生的 C/C++/Objective-C 编译器,旨在提供一个快速的编译器
调试器,LLDB,在 LLVM 和 Clang 的基础上构建的一个调试器
JIT 系统,VMKit, Java 和 .NET 虚拟机的 LLVM 技术实现
优化器,DragonEgg,集成了 LLVM 的优化器和搭配 GCC 解析工具的代码产生器
……
3.2 GCC
GCC,全称为 GNU Complier Collection,GCC 是 GNU Project 的关键组成部分,是由自由软件之父 Richard Stallman 在 1983 年9月27日于麻省理工大学发起的,旨在给一切计算机用户提供自由、可控的计算环境,用户可以自由的运行、分享、学习以及修改软件,即自由软件。
GCC 最初叫做 GNU C Compiler ,只支持 C 语言的编译,1.0 之后开始支持 C++,再随后支持了 Objective-C,Objective-C++,Fortran,Java,Ada,Go等其他语言。
至于选择哪个作为首选,则看具体情况了。
GCC 历史悠久,支持较为广泛,且目前许多开源项目都是直接使用 GCC 作为编译器的。当然,Clang 同为开源项目,可以跨平台使用,而 Clang 相对 GCC 的优势: 编译速度快:在某些平台上,Clang 的编译速度显著的快过 GCC。 占用内存小:Clang 生成的 AST 所占用的内存是 GCC 的五分之一左右。 模块化设计:Clang 采用基于库的模块化设计,易于 IDE 集成及其他用途的重用。 诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告。 设计清晰简单,容易理解,易于扩展增强。与代码基础古老的 GCC 相比,学习曲线平缓。
Clang 下编译一个 C++ 代码:
GCC 下编译:
两者用法类似。gcc 和 clang 有类似的编译选项命令,通过这些命令我们可以做许多事情。比如:
GCC 和 Clang 通过相应的编译选项,可以看到 build 过程某些步骤:
-E, 可以只执行预处理阶段,如:clang++ -E HelloWorld.cpp结果会打印出预处理后的代码,HelloWorld 只有 7 行,预处理过后却有几万行。
-S, 执行到编译阶段:clang++ -S HelloWorld.cpp这个阶段,会生成一个对应名称的 .s 文件,里面包含了所谓的机器指令——汇编代码,HelloWorld.cpp 生成了 86 行汇编代码
-c,执行到编译后的阶段,生成对应名称的 .o 对象文件
关于这两个工具的选项,使用 man gcc 和 man clang 可以看到更多详细的介绍。
Mac 下的 C++ 开发环境的更多相关文章
- Mac下搭建php开发环境教程
方案一:原生安装 这篇文章主要介绍了Mac下搭建php开发环境教程,Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例,需要的朋友可以参考 ...
- mac 下搭建 Android 开发环境
因工作需要,要在mac 下搭建 Android 开发环境.谷歌.度娘了好久,没有找个一个完整又系统的方法,很是苦恼.最终,皇天不负有心人,找到了下面这篇文档,结合亲身体验,特此记录.也为有这方面需求的 ...
- mac下安装c++开发环境
mac下安装c++开发环境 1 注册apple id 按照apple注册步骤注册apple id,我注册时遇到如下问题 apple store完成创建apple id步骤中,选择付款方式和账单地址后, ...
- Mac 下安装Phonegap开发环境
Mac 下安装Phonegap开发环境 2014.09.11 星期四 评论 0 条 阅读 5,613 次 作者:野草 标签:phonegap ios mac 什么是Phonegap呢?Phon ...
- 【开发软件】 在Mac下配置php开发环境:Apache+php+MySql
本文地址 原文地址 本文提纲: 1. 启动Apache 2. 运行PHP 3. 配置Mysql 4. 使用PHPMyAdmin 5. 附录 有问题请先 看最后的附录 摘要: 系统OS X ...
- Mac下部署Android开发环境附加NDK
作为开发者,我们深有体会,不管是进行什么开发,为了部署开发环境,我们往往需要折腾很长时间.查阅很多资料才能完成,而且这次折腾完了,下次到了另一台新电脑上又得重新来过,整个部署过程记得还好,要是不记得又 ...
- cocos2dx mac下搭建android开发环境
1)下载eclipse 地址:http://www.eclipse.org/downloads/ 2)安装adt 打开eclipse,菜单:help->install new software ...
- mac下搭建cordova开发环境
Apache Cordova 原名叫PhoneGap.是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台.PhoneGap最初由Nitobi开发,2011年 ...
- Android开发学习之路--MAC下Android Studio开发环境搭建
自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...
- mac下安装安卓开发环境
对于做ios的人来说,安装安卓开发环境,最好是在mac下安装了,我的mac是10.8.2,64位系统的 安卓开发环境需要下面几个东西: 1 jdk(mac下已经默认有了,可以在命令提示符下输入java ...
随机推荐
- 第三部分:Android 应用程序接口指南---第三节:应用程序资源---第一章 资源提供
第1章 资源提供 你应该经常外部化你应用程序代码中的资源,比如图片.字符串等,这样有利于你独立处理这些资源.你也应该根据特定的设备配置提供一些可替代的资源,并且把他们分组保存在指定的路径名下.运行时, ...
- [Big Data - Kafka] Kafka剖析(一):Kafka背景及架构介绍
Kafka是由LinkedIn开发的一个分布式的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Cloudera.Apache Storm.Spa ...
- error C3861: “xxxx”: 找不到标识符
问题出现背景:c++静态类库中主函数里包含子函数 解决办法:先声明子函数再写主函数.
- 【转】搭建Java版WebService
原文地址:http://www.cnblogs.com/jasoncc/archive/2011/12/22/2296052.html Hi,大家好! 今天主要和大家分享,如何搭建一个Web服务,做A ...
- Linux CentOS 6.9 Minimal 编译 OpenJDK 7
今天学习<深入理解Java虚拟机:JVM高级特性与最佳实践>一书,并动手在Linux系统上编译OpenJDK 7,初次搞不太顺利,特记录下编译操作细节. 一.前期准备 约定:工具默认安装目 ...
- ubuntu: apt-get update的时候遇到“Hash Sum mismatch”错误
http://blog.csdn.net/xjwjava/article/details/8543768 http://askubuntu.com/questions/140246/how-do-i- ...
- USI和USCI的区别
在 MSP430 系列中微控制器中有三种串行通讯模块.它们分别是 USART . USI 和 USCI . USART 支持同一硬件模块的两种串行模式,分别是 UART 和 SPI . USART 实 ...
- MAC下Myeclipse SVN插件安装
1.下载SVN插件包:http://download.csdn.net/detail/frankyanchen/4512899 2.在myeclipse文件夹下创建一个文件夹为svntool并复制下载 ...
- 仿迅雷播放器教程 -- duilib界面(13)
经过了这么多篇文章的讲解,相信大家也对界面库有一定了解了,用一个新的界面库,肯定要对它进行全方位考察.鉴于公司目前所有的产品都是MFC做的,全部转换成duilib肯定不现实,并且公司的很多项目逻辑和界 ...
- 为何谷歌围棋AI AlphaGo可能会把李世石击溃
/* 版权声明:可以随意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 谷歌DeepMind开发的人工智能围棋程序AlphaGo以5:0的压倒性优势击败了欧洲围棋冠军.专业二 ...