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
发布了6 篇原创文章 · 获赞 0 · 访问量 4815

猜你喜欢

转载自blog.csdn.net/baidu_36452960/article/details/103815828