⼀个程序从开始运⾏到结束的完整过程
源程序是指未经编译的,按照⼀定的程序设计语⾔规范书写的,⼈类可读的⽂本⽂件,源程序就是所写好的代码。
可执⾏程序,即常说的.exe程序,可以执⾏程序,完成计算机功能。在C语⾔中,.c⽂件就是所谓的源⽂件。
源程序到可执⾏程序的过程。在这个过程中,会发⽣如下的变化:
.c⽂件⽣成.obj⽂件的过程,称为编译,.obj⽂件⽣成到.exe⽂件的过程,称为链接。
.obj⽂件就是⼀个是程序编译⽣成的⼆进制⽂件,当.exe⽂件⽣成以后.obj⽂件就会被删除。
事实上,.c⽂件⽣成.exe⽂件的过程总共是经历了预处理,编译,汇编,链接,这四个过程。
1、预处理
为了接下来能够解释的更加清楚,使⽤linux平台下的gcc编译器解释。
先书写⼀个⾮常简单的程序来介绍:
test.c
1 #include<stdio.h>
2
3int main()
4 {源程序能直接执行吗
5    printf("hello");
6
7return0;
8 }
直接编译得到:
第⼀步发⽣的是预编译,使⽤-E指令会使程序只进⾏到预编译指令。经过预编译指令后的会⽣成⼀个.i⽂件。
在预编译的过程中,主要处理源代码中的预处理指令,引⼊头⽂件,去除注释,处理所有的条件编译指令,宏的替换,添加⾏号,保留所有的编译器指令。
当进⾏预编译以后的⽂件中将不再存在宏,所有的宏都已经被替代。当想要判断宏是否正确或者头⽂件包含是否正确时,也可以通过预编译来查看。
2、编译
在预处理结束后,进⾏的是编译。编译过程所进⾏的是对预处理后的⽂件进⾏语法分析,词法分析,语义分析,符号汇总,然后⽣成汇编代码。
3、汇编
汇编过程将汇编代码转成⼆进制⽂件,⼆进制⽂件就可以让机器来读取。每⼀条汇编语句都会产⽣⼀句机器语⾔。
在这⾥最终会⽣成⼀个重定位⽬标⽂件 .o⽂件,类似windows下的.obj⽂件。这⾥⽣成的⽬标⽂件⾥⾯就是⼆进制⽂件。另外,在这⾥会形成符号表,给这些符号会分配虚拟地址。
4、链接
由汇编程序⽣成的⽬标⽂件并不能⽴即就被执⾏,其中可能还有许多没有解决的问题。例如,某个源⽂件中的函数可能引⽤了另⼀个源⽂件中定义的某个符号(如变量或者函数调⽤等);在程序中可能调⽤了某个库⽂件中的函数等等。所有这些问题,都需要经链接程序的处理⽅能得以解决。链接程序的主要⼯作就是将有关的⽬标⽂件彼此相连接,也即将在⼀个⽂件中引⽤的符号同该符号在另外⼀个⽂件中的定义连接起来,使得所有的这些⽬标⽂件成为⼀个能够被操作系统装⼊执⾏的统⼀整体。
链接分为静态链接和动态链接:
静态链接:后缀是.a,主要在编译的时候将库⽂件⾥⾯代码搬迁到可执⾏的⽂件中;
动态链接:后缀是.so,主要在执⾏的时候需要转换到库⽂件代码执⾏;
两种链接的优缺点:
(1)静态的链接产⽣的可执⾏的⽂件体积⽐较的⼤;⽽动态链接的可执⾏⽂件的体积⽐较⼩;
(2)动态的链接的编译的效率⽐较的⾼;
(3)静态链接的可执⾏的⽂件执⾏的效率⾼
(4)静态链接的可执⾏的⽂件的“布局”⽐较好⼀点;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。