c语言从一个源代码文件到生成可执行文件的过程

来源:互联网 发布:mysql锁表 解锁 编辑:程序博客网 时间:2024/05/22 01:58

c语言的编译一般会阶段3个阶段的过程: 预编译  编译    链接


预编译阶段要做的事(处理一些以#开头的指令):

                   1、展开头文件。比如#include<stdio.h>这样的头文件中存在许多的函数定义,预编译要做的事就是把这个头文件中的函数定义全部替换出来。

                   2、处理宏定义。比如说#define N 3.这样的宏定义在预编译阶段就会把源代码文件中的N全部换成3.

                   3、处理条件编译语句。包含了两类,头文件中的预编译条件和源代码文件中的条件编译语句

头文件的条件语句:                                                                                                                 

#ifndef _SIZE_T                                          
#define _SIZE_T
typedef unsigned size_t;
#endif
一般的格式是
#ifdef
#elifdef
#else
#endif
 
 
源代码的条件语句:
#if 0
printf("hello");
#else
printf("word");
#endif

 

编译阶段要做的事:

                   1、调整源代码文件中每一行的格式,在行尾加上换行字符。  在这一过程中会优化源代码字符中每一行的代码,去掉多于的换行,并且会把三字符组替换成单字符

                   2、此源代码文件被分解成预处理器的记号和空格符, 在这过程中注释会被转换成一个空格符。

                          形式如下:

                      

  1 #include <stdio.h>  2   3 int main()  4 {  5         printf("hello word\n");  6 }  7 所谓的记号就是在语意上存在一定的逻辑的符号。  8   9 上面的printf函数会被分成: 10 printf 11 ( 12 "hello word\n" 13 ) 14 ;

                3、执行上面的记号序列

                4、转换字符成运行字符集中对应的字符

                5、 编译器分析记号产生的序列,产生对应的机器码

通过以上的编译阶段我们可以发现,编译阶段要作的事就是优化源代码,并且把与源代码字符集中的字符转换成运行字符集中的字符。其目的是查找语法错误。

                通过gcc -S  test.c   -o  test.s         可以产生一个对应的汇编语言的文件

                通过gcc -c   test.s  -o   test.o         产生一个二进制文件,但是此二进制文件不一定可以执行

                通过gcc test.o   -o   test                  生成一个可执行的二进制文件

可以直接从源代码文件编译成可执行的二进制文件:

               gcc   test.c    -o   test                           不要写成    gcc   -c   test.c   -o test


编译阶段主要做的事就是把翻译单元中的内容生成机器码,(一般先生成汇编语言)

链接阶段主要做的事就是把所有的机器码组合起来,为每一条汇编指令提供一个地址,然后在运行阶段把这些指令放到内存中去执行。

链接阶段:

         链接阶段的主要任务就是展开头文件,调用标准链接库里面定义的函数(这些函数是可执行的函数,不能看见源代码)
,有些函数是静态的去调用,就是直接把函数体写到源文件中,但是有些函数是动态链接的,就是在链接阶段只判断这个函数的存在性,分配一个地址,在执行时在来替换函数。

所以就存在了在运行阶段有时也会调用动态链接库。


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子不会动手打人怎么办 小孩子隔奶奶涨怎么办 小孩子戒奶奶涨怎么办 孩子总打别人怎么办 儿童在学校打人怎么办 两岁儿童打人怎么办 孩子哭闹要东西怎么办 高中孩子爱打架怎么办 宝宝性格太弱怎么办 宝宝太老实了怎么办 一岁多宝宝爱打人怎么办 一岁半宝宝爱打人怎么办 两岁半宝宝喜欢打人怎么办 孩子总是挨欺负怎么办 一年级孩子爱打架怎么办 孩子没规矩家长怎么办 小朋友在幼儿园打人怎么办 幼儿园小朋友喜欢打人怎么办 三周岁宝宝爱哭怎么办 2周岁宝宝爱哭怎么办 一个月宝宝爱哭怎么办 2岁宝宝爱哭怎么办 三岁小朋友打人怎么办 一岁半小朋友喜欢打人怎么办 爷爷偏心我该怎么办 冲动型学生老师怎么办 两个宝宝争东西怎么办 2周岁宝宝打人怎么办 小孩幼儿园被打怎么办 小孩喝了润滑油怎么办 孩子被打了怎么办 宝宝吃了指甲油怎么办 孩子掉了深海怎么办 小孩打了别人怎么办 两岁宝宝爱咬人怎么办 孩子上学老打人怎么办 孩子上学爱说话怎么办 孩子抢玩具打人怎么办 生气就像打人怎么办 小孩总喜欢打人怎么办 小孩性格好翘怎么办