C语言编译过程详解以及静态库动态库起作用的过程

编译过程简介

在此时需要了解C语言从源代码到二进制程序在这时经历了哪些过程,在此时就是经过了最后预处理、编译、汇编、链接这四个步骤。
如果输入操作指令在此时就是
$ gcc hello.c # 编译
$ ./a.out # 执行
这两个指令。

1、预处理 - Preprocessing

在这个阶段进行的工作是展开头文件,宏替换将所有的#include头文件以及宏定义替换成其真正的内容,就是在此时起到一个展开的作用。去掉注释,条件编译,空行为编译做出准备工作。
预处理之后代码体积会大很多。
在下这个阶段生成对应的.i文件。

2、编译 - Compilation

首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,再把代码翻译成汇编语言。然后进
行的工作就是将经过预处理之后的程序转换成特定汇编代码。
编译程序工作时,先分析,后综合。所谓分析,是指词法分析和语法分析;所谓综合是指代码优化,存储分配和代码生成。为了完成这些分析综合任务,编译程序采用对源程序进行多次扫描的办法,每次扫描集中完成一项或几项任务,也有一项任务分散到几次扫描去完成的。下面举一个四遍扫描的例子:第一遍扫描做词法分析;第二遍扫描做语法分析;第三遍扫描做代码优化和存储分配;第四遍扫描做代码生成。
阶段生成对应的.s文件。

3、汇编 - Assemble

汇编代码转换机器码,在此时我们生成的叫目标文件,在此时是二进制的格式,在此时通过gcc操作指令来进行的。

在这个阶段生成对应的.o文件。

4、连接 - Linking

链接到一起生成可执行程序

在此时生成的是a,.out这个可执行文件。

动态库静态库

库是程序代码的集合,是共享程序代码的一种方式,所谓静态、动态是指链接。意在此时是一个二进制的文件。说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。
Windows下:dll 动态库.lib 静态库
Linux下:.so 动态库.a 静态库
什么时候我们会用到库呢?
一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。
一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制。

静态库:标文件以一种特定的方式打包成一个单独的文件,并且在链接生成可执行文件时,从这个单独的文件中“拷贝”它自己需要的内容到最终的可执行文件中。这个单独的文件。这段代码在目标程序里就不会再改变了。
动态库:拷贝”一些重定位和符号表信息,这些信息可以在程序运行时完成真正的链接过程。动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。
静态库与动态库的区别在于链接的这一个阶段下是怎么进行处理的。
静态库特点
1、库对函数库的链接是放在编译时期完成的。
2、程序在运行时与函数库再无瓜葛,移植方便。
3、浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
动态库在程序编译时并不会被连接到目标代码中。
动态库特点
1、动态库把对一些库函数的链接载入推迟到程序运行的时期。
2、可以实现进程之间的资源共享。(因此动态库也称为共享库)
3、将一些程序升级变得简单。
4、甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值