linux下的编译工具——gcc/g++

本文详细介绍了GCC和G++的用途,以及C/C++程序从预处理、编译、汇编到链接的全过程。预处理包括头文件展开、宏替换等;编译阶段将源代码转化为汇编代码;汇编阶段生成可重定位目标文件;链接阶段将目标文件与库文件结合,形成可执行程序。动态链接和静态链接的区别在于是否拷贝库函数到目标代码中。文章还提及了动态库(.so)和静态库(.a)的使用以及安装方法。
摘要由CSDN通过智能技术生成

目录

一 gcc g++简介

二程序翻译的过程

1 -E 预处理

2 -S 编译

3 -c汇编

4 链接 


 

一 gcc g++简介

功能:主要是编译C语言和c++的工具。编译c语言用gcc,编译c++语言用g++。g++也可以用来编译c语言,因为c++语言兼容C语言

我们可以先查看一下有没有安装对应的工具以及工具的版本。

gcc/g++ -v

 

如果没有安装的话,就执行sudo yum install -y gcc-c++来实现对应工具的安装。

二程序翻译的过程

1 预处理阶段:头文件展开 宏替换 去注释 条件编译

2 编译:将代码转换成汇编代码

3 翻译:将对应的汇编代码翻译成二进制机器码

4 链接:形成可执行程序

接下来通过gcc工具来给大家演示上述的几个过程。

相关操作

形成可执行程序:

gcc 编译前的文件 -o 编译后形成的文件 或者

gcc -o 编译后形成的文件 其他的原文件

只要保证-o选项后面跟着的是编译后形成的文件就可以了。

由于需要一步一步地带大家理解编译链接的过程,而上述操作是一步到位的。因此接下来讲解分步的操作。

1 -E 预处理

从现在开始进行程序的翻译,如果预处理完成,就停下来。生成的是.i类型的文件。

①头文件展开:头文件的内容会被直接拷贝到原文件中,是有很多内容的。因此一个工程中,为了防止头文件重复包含,一般要加上#program once.

②宏替换:代码中出现的宏被直接替换成定义的宏

③去注释:原先添加注释的地方也没有了。因为注释主要是方便自己阅读,去注释就看不到对应的内容了。

④条件编译:满足条件就去编译,不满足条件就不执行。

被处理后的仍然是C语言

2 -S 编译

核心工作:将对应的C语言转换成汇编代码。

-S:从现在开始进行程序的翻译。如果编译完成就停止。

3 -c汇编

-c:从现在开始进行程序的翻译。如果汇编完成,就停下来。

把汇编语言编译成可重定位二进制目标文件

他是不能被直接执行的。

4 链接 

对可重定位目标二进制文件进行链接。

首先先让大家对一个文件形成可执行程序的过程有个基本的了解之后,我会给大家描述一下链接的基本过程,相应的动态库,静态库,以及如何下载对应的库文件和我们的程序与动静态库关联的方法。

基本过程:

关于链接的两种方式:动态链接和静态链接

一般链接的基本过程就是把我们自己写的代码和库文件,通过头文件中的声明来建立关联。

一般有两种链接的方式:动态链接和静态链接,他们分别是要依赖相应的动态库和静态库。

所谓的头文件已经在系统中存在了。所谓的库文件其实就是函数的实现方法。相应的库文件一般也已经在我们下载的时候被安装在了对应的目录中,这样我们编译代码的时候由编译器主动去寻找就行了。

头文件

库文件 

 

 

 

所以编写的文件,即使没有包含头文件,编译(形成可重定位目标二进制文件)的时候也是没有问题的。只不过无法链接形成可执行的程序。

这么说有点抽象,举个例子:

没有包含对应的头文件

 可以编译 

一言以蔽之:头文件中的函数的声明+库文件中函数的定义和实现---以某种方式链接-------》可执行程序

所以如果要形成可执行程序,链接的过程就显得很重要了。

观察上述库文件,其实在linux中,以.so结尾的是动态库,以.a结尾的是静态库。

静态链接说得通俗一点,就是拷贝。必须使用.a结尾的静态库。把对应库中的函数实现方法在我们自己的代码中直接进行拷贝。这种方法依赖系统中的库文件,因为自己代码中就已经存在了。但是他可能出现大量的重复代码,占用资源。如果需要动态链接需要带上对应的-static选项。

 

动态链接则是把我们程序中填入我们需要的方法的地址,与系统中的库文件建立关联。必须使用以.so结尾的动态库。这时候我们就可以通过对应的地址来找到对应的方法了。这样做的好处是比较节省资源,因为它只保存对应的地址。 一般gcc默认的链接方式是动态链接。

 

安装:

sudo yum install -y glibc-static       C静态库

sudo yum install -y libstdc++-static   C++静态库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值