【Linux】深入理解GCC/G++编译流程及库文件管理

目录

1.背景知识

2.gcc/g++如何完成编译

(1) 预处理(进行宏替换)

(2) 编译(生成汇编)

(3) 汇编(生成机器可识别代码)

(4) 链接(生成可执行文件或库文件)

(5) 总结

(6) 函数库

① 静态函数库

② 动态函数库

③ 动静态库比较

④ 验证动/静态链接

⑤ ldd - 程序的动态函数库解析

(7) gcc选项


1.背景知识

(1) 预处理(宏替换,条件编译)

(2) 编译(生成汇编)

(3) 汇编(生成机器可识别代码)

(4) 链接(生成可执行文件或库文件)

2.gcc/g++如何完成编译

格式 gcc [选项] 要编译的文件 [选项] [目标文件]

(1) 预处理(进行宏替换)

● 预处理功能个主要包括宏定义,文件包含,条件编译,去注释等。

● 预处理指令是以#号开头的代码行

● 【-E】选项的作用是,从现在开始进入程序编译,在预处理的时候就停下来

● 【-o】选项是指定目标文件,【.i】文件为已经预处理过的C原始程序

● 实例:gcc -E test.c -o test.i 将原始C语言代码预处理后的内容写到指定的 test.i 文件里

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -E test.c -o test.i
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
-rw-rw-rw- 1 zyt zyt   270 Nov 18 09:16 test.c
-rw-rw-r-- 1 zyt zyt 16951 Nov 18 09:16 test.i

● 得到的【.i】文件还是C语言文件

● 预处理后的 【.i 】文件相比原来大很多

那是因为预处理器会将#include指令包含的头文件内容直接插入到源文件中(这些头文件都是被提前装在系统的/usr/include 目录下);预处理器宏定义展开;预处理器还会处理条件编译指令,如#ifdef#ifndef#endif等,这些指令可能会根据条件包含或排除某些代码段。

● 如何理解条件编译?

- 对软件进行专业度,收费情况进行区分(业务),使用条件编译,可以进行代码动态裁剪。

- 内核源代码也是用条件编译进行代码裁剪。

- 开发工具,应用软件也是用条件编译对功能代码动态裁剪。

(2) 编译(生成汇编)

● 在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。

● 使用【-S】选项,gcc 会将C语言代码编译成汇编语言,并将结果输出到一个文件中,该文件的扩展名通常是【.s】

● 实例:gcc -S test.i -o test.s

[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ gcc -S test.i -o test.s
[zyt@iZ2vcf9wvlgcetfeub9f11Z ~]$ ll
total 28
-rw-rw-rw- 1 zyt zyt   284 Nov 18 09:36 test.c
-rw-rw-r-- 1 zyt zyt 16945 Nov 18 09:37 test.i
-rw-rw-r-- 1 zyt zyt   589 Nov 18 09:39 test.s

我们打开.s文件看看,得到的是汇编文件

(3) 汇编(生成机器可识别代码)

● 汇编阶段是把编译阶段生成的【.s】文件转成目标文件

● 这个目标文件其实就是可重定位目标文件,此时已经是二进制文件了,但是无法直接执行,即使加上可执行权限。那是因为这个.o文件只是把我写的源文件编译成二进制了,而我们写的源文件中会包含很多的库方法,这些库方法还没有跟我们写的内容关联起来,所以是不可能运行的。(形象来说,就是我写的代码里用到了ptintf方法,但.o文件里没有print方法的实现,它的实践是在库里面实现的),win上形成的是XXX.obj。

● 使用【-c】选项就可以看到汇编代码转化为

评论 59
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值