关于C++ 的编译

背景知识

C++的编译其实严格来说应该是一个(build)的过程,它包含几个子步骤:

  1. 预处理 (preprocessing)
  2. 编译 (compiling)
  3. 链接 (linking)

预处理

预处理的工作主要有四种:

  • 宏替换(#define)
  • 条件编译(#if,#ifndef,#ifdef,#endif,#undef )
  • 文件包含(#include)
  • 布局控制(#progma)

编译

编译意味着把一个源文件(.cpp)转变成一个对象文件(object,.o 或 .obj)。
一个对象文件会把你程序里的每一个函数,封装成一个计算机处理器能理解的形式——机器指令。

链接

链接(Linking),是把一堆对象文件和库(有时也可能仅仅是一个对象文件,但也需要链接)创建成一个单独的可执行文件(比如 .exe 或 .dll)。
链接器通过一种适当的格式创建一个可执行的文件,并传递每个独立的对象文件内容到一个可执行的结果。链接器也处理含有对象文件源代码之外的其它函数的引用,比如 C++ 标准库里的函数。当你调用了一个 C++ 标准库的函数,如 cout <<“Hi”,你就在使用一个自己代码中没有定义的函数,它被定义在一个相关的对象文件中,但这是由编译器提供的,并不属于你。在编译时,编译器知道这个函数是有效的,因为你引出了 iostream 头文件,但由于这个函数不是 cpp 文件的一部分,编译器就会在调用树(call tree)留下一个存根(stub),链接器会遍历对象文件,针对每一个存根,它会找到正确的函数地址,然后从已链接过的其它对象文件中,用正确的地址替换掉对应的存根。
这个过程有时也叫做修正(fixup)。

Clang\GCC\gcc\g++

Mac 下,如果你安装了 Xcode ,那么你就拥有了 LLVM 和 GCC 两大编译工具。首先了解GCC:

GCC是 GNU 编译器套装(英语:GNU Compiler Collection,缩写为** GCC**),指一套编程语言编译器,以 GPLLGPL 许可证所发行的自由软件,也是 GNU 项目的关键部分,也是 GNU 工具链的主要组成部分之一。GCC(特别是其中的 C 语言编译器)也常被认为是跨平台编译器的事实标准。1985 年由理查德 · 马修 · 斯托曼开始发展,现在由自由软件基金会负责维护工作。

要先明确一个点:GCC和gcc以及g++指代是不同的。

GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译 C、C++、JAV、Fortran、Pascal、Object-C、Ada 等语言。
gcc 是 GCC 中的 GUN C Compiler(C 编译器)
g++ 是 GCC 中的 GUN C++ Compiler(C++ 编译器)

一个有趣的事实就是,就本质而言,gcc 和 g++ 并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的 GUN 编译器而已,比如,用 gcc 编译一个 c 文件的话,会有以下几个步骤:

  • Step1:Call a preprocessor, like cpp.
  • Step2:Call an actual compiler, like cc or cc1.
  • Step3:Call an assembler, like as.
  • Step4:Call a linker, like ld

由于编译器是可以更换的,所以 gcc 不仅仅可以编译 C 文件
所以,更准确的说法是:gcc 调用了 C compiler,而 g++ 调用了 C++ compiler

gcc 和 g++

  1. 对于 *.c 和 *.cpp 文件,gcc 分别当做 c 和 cpp 文件编译(c 和 cpp 的语法强度是不一样的)
  2. 对于 *.c 和 *.cpp 文件,g++ 则统一当做 cpp 文件编译
  3. 使用 g++ 编译文件时,g++ 会自动链接标准库 STL,而 gcc 不会自动链接 STL
  4. gcc 在编译 C 文件时,可使用的预定义宏是比较少的
  5. gcc 在编译 cpp 文件时 / g++ 在编译 c 文件和 cpp 文件时(这时候 gcc 和 g++ 调用的都是 cpp 文件的编译器),会加入一些额外的宏。
  6. 在用 gcc 编译 c++ 文件时,为了能够使用 STL,需要加参数 –lstdc++ ,但这并不代表 gcc –lstdc++ 和 g++ 等价,它们的区别不仅仅是主要参数。

Clang与GCC

Mac 的 OS X 系统的 C 语言 编译器用的是 Clang,如下图,在 Terminal 输入 gcc -v 或者 gcc --version 后,显示 C 语言 的编译器:

屏幕快照

macOS 中的 gcc 和 g++ 苹果开发者们并没有去改造和重写它们,只是分别指向 clang 和 clang++ 编译器。Clang 是一个 C++ 编写、基于 LLVM、发布于 LLVM BSD 许可证下的 C/C++/Objective C/Objective C++ 编译器,其目标(之一)就是超越 GCC。LLVM 历史 Apple(包括中后期的 NeXT) 一直使用 GCC 作为官方的编译器。GCC 作为开源世界的编译器标准一直做得不错,但 Apple 对编译工具会提出更高的要求。此外 GCC 作为一个纯粹的编译系统,与 IDE 配合得很差。加之许可证方面的要求,Apple 无法使用 LLVM 继续改进 GCC 的代码质量。于是,Apple 决定从零开始写 C、C++、Objective-C 语言的前端 Clang,完全替代掉 GCC。正像名字所写的那样,Clang 只支持 C,C++ 和 Objective-C 三种 C 家族语言。

到这里对GCC、Clang、g++、gcc应该有个比较清晰的理解了。

参考博文:

  1. Mac下的C++开发环境
  2. GCC的gcc和g++的区别
  3. 将 Mac OS X 系统的 C、C++ 编译器从默认的 Clang 切换到 GCC
  4. macOS中神秘的GCC
  5. Xcode 工程设置里面编译器选项为啥没有 GCC?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容