C,是一种信仰

C程序的编译和链接过程

想要编写C代码,就必须得有一个编译环境。简单地说,程序从我们的大脑到实现,要经过一下过程:

image

显然,我们的最终目标是4。但是我们所能操纵的是1。在1中,我们用各种各样的编辑软件,写我们的C语言源代码,并将其保存为.c结尾的源文件。形如:

image

里面的内容形如:

image

接下来,想要把这部分源代码变成.exe的可执行程序,是非常困难的。幸运的是,我们有一整套的编译系统,可以帮助我们完全自动化地完成这部分工作。

TCC就是这样的一个编译系统。当然Visual C++ 6.0也是这样的一个编译系统。所以我们经常说“你用的是什么编译器?”“哦,我用的是VC++ 6.0。”讲的就是所用的编译系统。

真正的编译系统其实会做两件事,第一件是所谓的“编译”:把.c的源代码文件编译成.obj结尾的目标文件

目标文件已经是二进制文件了,也就是说,你已经无法看懂里面的内容了。在编译的过程中,如果编译系统发现任何源代码错误(比如使用一个从未声明过的变量),就会报错,这时候,程序员,也就是你,就必须回过头来修改自己的.c源文件,希望能够将来能够通过编译了。

如果你的.c源文件已经通过了编译,就会生成.obj的目标文件。需要指出的是,根据平台的不同,.obj的扩展名可能发生变化,比如在windows下,可能生成的是.obj文件,而在linux平台下,可能生成的是.o的文件。但无论如何,这个所谓的“目标文件”已经是二进制代码的文件了,而且是平台无关的。所谓的“平台无关”你可以理解成,这个二进制文件既可以变成在windows平台下运行的程序,也可以变成在linux等其他平台下运行的程序。

要想将二进制的“目标程序”变成真正可以运行的“可执行程序”还需要依靠编译系统。这里,用到的是编译系统会做的第二件事:链接。链接,就是把目标程序变成真正可以(双击)执行的.exe可执行文件(windows环境)。

你可能会奇怪:为什么要生成所谓的“目标文件”,而不是直接生成.exe的“可执行文件”呢?原因是这样的:有的程序员所写的程序可能非常的牛,有机会在许许多多不同的平台下运行(从windows到linux到iphone到Android,不一而足)。这时候,这些程序员发布自己的程序时,很可能不会选择发布源代码(商用程序,要保密),而他自己也没办法为每一个可能的平台逐个生成可执行程序;那他就会选择发布“目标文件”的形式。用户收到“目标文件”之后,既可以随心所欲地在任何平台上通过编译系统的“链接”功能生成对应平台的“可执行程序”,也不会了解到程序员的源代码是如何编写的,从而保护了商业秘密。如下图所示:

image 

在从2-->3的(链接)过程后,生成4的可执行程序看起来像这样:(windows环境)

image 注意到该文件的扩展名是.exe。这就是我们真正可以在windows下执行的程序。

有的同学在培训的时候,看到我写C代码时,用的不是VC++ 6.0的编译器,觉得很新鲜。请继续看下面的2篇文章介绍:

1、编写C源代码的利器:Notepad2介绍:http://www.cnblogs.com/fzd19zx/archive/2011/01/22/1942192.html

2、TCC(Tiny C Compiler)介绍:http://www.cnblogs.com/fzd19zx/archive/2011/01/22/1942191.html

posted @ 2011-01-22 20:54  胖乎乎的王老师  Views(2614)  Comments(3Edit  收藏  举报
Email 联系我:fzd19zx@qq.com