良许Linux教程网 干货合集 GCC为何如此强大?

GCC为何如此强大?

做软件开发的读者,应该对GCC都不会陌生,之所以大家都能知道它,了解它,是因为它具备许多独特而强大的功能。

一、GCC发展史

GNU项目计划的主要目标是创建一个名为GNU’s Not Unix(GNU)的完全免费的操作系统,该操作系统将包括绝大多数自由软件基金会开发的其他软件,以对抗商业软件。这个操作系统的核心(kernel)被命名为HURD。

然而,GNU在开发完全免费的操作系统上并未取得成功。直到20世纪90年代,由林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds)开发了Linux操作系统,GNU才算在免费操作系统上完成了任务。

尽管GNU在开发免费操作系统方面没有成功,但它成功地开发了几个广为流传的GNU软件,其中最著名的是GNU C编译器(gcc)。

这个软件成为历史上最出色的C语言编译器之一,其执行效率比一般编译器平均高出20%~30%。这使得那些依赖出售编译器的公司感到头疼,因为它们无法开发出与gcc同样优秀、完全免费且开源的编译器。

二、关于GCC

GCC 原来代表“GNU C Compiler”的意思,GCC 是 GNU 推出的功能强大、性能优越的多平台编译器,是 GNU 的代表作品之一。

自从面世后,GCC 逐渐扩充、发展,现在不仅仅支持C语言,还支持其他很多语言,包括 C++、Ada、Objective-C、Fortran 和 Java 等。因此,GCC 的意思被重新定义为“GNU Compiler Collection”,也即“GUN 编译器套件”。

GUN 编译器套件包含多种前端处理器,以翻译各种不同语言。当然,在本教程中我们重点讨论的是基于C语言的前端处理器 GCC。

GCC 也是一种多目标(multitarget)编译器;换句话说,它通过使用可互换的后端处理器,为多种不同的计算机架构生成相应的可执行程序。

image-20231215191051866
image-20231215191051866

正如模块化概念所提倡的,GCC 可被用作交互式编译器;也就是说,可以使用 GCC 对所有设备与操作系统创建可执行程序,不需要局限于仅仅是运行 GCC 的平台。然而,这么做需要特殊的配置和安装,大多数 GCC 的安装,仅能针对它们的宿主系统编译程序。

GCC 不仅支持C的许多“方言”,也可以区别不同的C语言标准;也就是说,可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个C标准。

三、GCC编译流程

GCC 编译器在编译一个C语言程序时需要经过以下 4 步:

将C语言源程序预处理,生成.i文件。

预处理后的.i文件编译成为汇编语言,生成.s文件。

将汇编语言文件经过汇编,生成目标文件.o文件。

将各个模块的.o文件链接起来生成一个可执行程序文件。

GCC 编译流程如下图所示:

image-20231215191103165
image-20231215191103165

.i文件、.s文件、.o文件可以认为是中间文件或临时文件,如果使用 GCC 一次性完成C语言程序的编译,那么只能看到最终的可执行文件,这些中间文件都是看不到的,因为 GCC 已经经它们删除了。

四、GCC编译选项

GCC 是一个功能强大的编译器,其编译选项非常多。有些选项一般程序员根本不会用到。因此将所有的编译选项全部列出讲解是不明智的。下面只对一些 gcc 编译器的常 用选项进行详细的讲解,这些选项在实际编程过程中非常实用。

image-20231215191106167
image-20231215191106167

注意:gcc 编译选项会区分大小写。因此-o选项和-O选项的效果是不一样的。前者表示源文件编译成为可执行文件,后者表示将源文件编译成为可执行文件并且进行一级优化。

五、其他强大功能

其他编译器有的功能,绝大部分在GCC中都有,下面简单介绍一些功能。

1.GCC 生成动态链接库

Linux 下动态链接库(shared object file,共享对象文件)的文件后缀为.so,它是一种特殊的目标文件(object file),可以在程序运行时被加载(链接)进来。使用动态链接库的优点是:程序的可执行文件更小,便于程序的模块化以及更新,同时,有效内存的使用效率更高。

2.GCC 生成静态链接库

Linux 下的静态链接库是以.a结尾的二进制文件,它作为程序的一个模块,在链接期间被组合到程序中。和静态链接库相对的是动态链接库(.so文件),它在程序运行阶段被加载进内存。

制作链接库的目的是希望别人使用我们已经实现的功能,但又不希望别人看到我们的源代码,这对商业机构是非常友好的。

Linux 下静态链接库文件的命名规则为:

libxxx.a

xxx 表示库的名字。例如,libc.a、libm.a、libieee.a、libgcc.a 都是 Linux 系统自带的静态库。

3.C语言和C++的混合编译

在 GCC 编译器中,可以将不同编程语言生成的目标文件混合在一起使用,但是操作起来非常的困难,因为不同的编程语言都有自己的特性。混合使用时要处理好产生的各种问题,包括全局命名约定、命令、参数传递、数据类型转换、出错处理,以及两种语言标准运行时的库的混合。

类似,Java和C语言同样也可以混合编译。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部