GCC的编译过程

用编译器GCC生成可执行文件,看似简单的一步完成,其实包含了四个过程。分别是:

  1. 预处理(Pre-processing):这一步需要分析各种预处理命令,如#define、#include、#if,#ifndef,#ifdef,#endif,#undef等。对于宏而言,GCC会将宏定义的内容直接替换,#include则是将.h文件里的内容直接在源程序中展开。对于#if等,会先判断预编译的宏定义条件是否满足,以此决定代码段是否生效。GCC的预处理是通过cpp程序来处理的,预处理生成.i文件,以hello.c为例:
gcc –E hello.c –o hello.i
  1. 编译(Compilation):在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等。在检查无误后,GCC会将代码翻译成汇编语言。这一步生成.s文件,用户可以使用”-S”选项来进行查看。-s让编译器在编译生成.s文件后停止,不进行后续过程。
gcc –S hello.i –o hello.s
  1. 汇编(Assemble):这一步将汇编语言作为输入,为每一个源文件(包括库文件)生成扩展名为.o的二进制目标文件。
gcc –c hello.s –o hello.o
  1. 链接(Linking):链接的作用在于,找到.h文件中定义的系统函数实现,分为静态链接和动态链接。其中,静态链接是指链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”。gcc默认使用动态链接。
    完成链接之后,即会生成可执行文件a.out,也可单独指定文件名。用./可以直接运行。
gcc hello.o -o hello
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值