c程序生成过程

时间:2023-01-03 00:56:20

 

   在vc6下写一个c程序,点一下编译 点一下链接,程序就能跑了。但我们的程序是如何从代码编程计算机课可执行的文件的,好像不是很清楚,这个IDE悄悄帮我们做了好多事情。 我们的程序从代码变成机器可执行的机器码,一般经过预编译,编译,汇编,链接。这几个步骤,为什么是这样的几个步骤,我觉得这是和编程语言的发展历史有关。

      最早写程序与计算机交流用机器码,打纸袋的年代。后来发展出了汇编语言,然后再有了我们现在用的高级语言。现在写程序一般都是用高级语言,这便于程序员使用,但计算器其实不认识这些,它只认识机器 0 1 码。所以要把我们写的高级语言一步步再转换成机器码,经过编译,高级语言编程汇编语言,经过汇编,汇编语言编程机器语言,这时计算机才能读懂执行。

在linux下用gcc编译一个c程序 能很好的体会上述过程

gcc编译器有这么几个选项 -E   -S   -c    其实是分别对应上述四个过程的

当写了一个test.c

 

gcc -E  test.c -o test.i

这一步只进行预处理,简单理解就是解决你程序中  #  开头的那行东西,例如将include的文件代码加进来,进行一些宏替换,判断一些条件编译等。 生成test.i目标文件。


gcc -S test.i -o test.s

这一步只进行汇编,将高级语言转换成汇编代码。 生成test.s   .s后缀的是汇编语言文件


gcc -c test.s -o test.o

这一步进行汇编,将.s 文件里的汇编语言转换成机器码。test.o


gcc test.o -o test

这一步进行连接,如果程序有多个相关的.o文件 会被连接起来,还做一些库函数的连接等,执行完这一步,就生成可以执行程序了。


       啰嗦一下整个过程: 先将你的宏处理掉,包含的文件代码加进来,然后把这些代码转换成汇编语言,再将汇编语言转换成机器码,最后在再将一些不同文件中声明定义的变量啊  函数啊 包括库函数什么的链接起来 ,就生成可执行程序了。


GCC编译器的基本选项如下表:

类型 说明
-E 预处理后即停止,不进行编译、汇编及连接,生成.i文件
-S 编译后即停止,不进行汇编及连接, 生成.s文件
-c 编译或汇编源文件,但不进行连接,生成.o文件
-o file 指定输出文件file,生成可执行文件
这是一个

一些文件后缀,对照一下



.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx为后缀的文件,是C 源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C 源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。