预编译-编译-汇编-链接的过程

1.整体的过程

#icluude<stdio.h>
int main()
{
	printf("hello\n");
	return 0;
}		

上述代码的执行需要四个步骤:预编译(prepressing)、编译(compilation)、汇编(assembly)和链接(linking),如下图所示:
在这里插入图片描述

2.预编译

工作:处理源文件和头文件。
在linux下的指令为:

gcc -E hello.c -o hello.i

预编译阶段处理‘#’开始的预编译指令:
a)将所有的#define删除,并展开宏定义;
b)处理所有预编译指令,如“#if”,“#endif”等;
c)处理#include预编译指令,将被包含的文件插入到预编译指令的位置;
d)删除所有的注释,“//”和“/**/”;
e)添加行号和文件标识;
f)保留所有的#pragma编译器指令。

3.编译(最核心的过程)

工作:将处理后的高级语言文件转化为汇编代码文件。
汇编过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件。
在linux下的指令为:

gcc -S hello.i -o hello.s

4.汇编

工作:将汇编代码文件转换成相应的二进制代码(机器指令)文件。或者说是转换成机器语言。
在linux下的指令为:

gcc -c hello.s -o hello.o

预编译——汇编,一步到位的指令:

gcc -c hello.c -o hello.o

5.链接

功能:将需要的文件都给“连接”起来,最后才可以得到“a.out”文件。

库:预先编译好的方法的集合。

5.1静态链接

在这里插入图片描述

5.2动态链接

在这里插入图片描述

5.3静态库和动态库的对比

a)静态库中函数若被main调用之后,把静态库删除,main正常执行。
动态库需要一直存在,main才可以执行,删除则main不能执行;
b)调用静态库中的函数,直接拷贝到main函数中,而动态库只需要标记位置,所以动态库更节省空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值