从源文件到可执行文件
1.计算机只能运行本地代码
本地(native)这个术语有“母语的”意思。 对CPU来说,母语就是机器语言, 而转换成机器语言的程序就是本地代码。 用任何编程语言编写的源代码, 最后都要翻译成本地代码, 否则CPU就不能理解。也就是说,即 使是用不同编程语言编写的代码,转换成本地代码后,也都变成用同一种语言 (机器语言)来表示了。
2.编译器负责转换源代码
能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。 每个编写源代码的编程语言都需要其专用的编译器。将C语言编写的源代码转换成本地代码的编译器称为 C编译器。编译器首先读入代码的内容, 然后再把源代码转换成本地代码。编译器中就好像有一个源代码同本地代码的对应表。但实际上,仅仅靠对应表是无法生成本地代码的。 读人的源代码还要经过语法解析、句法解析、语义解析等,才能生成本地代码。根据CPU类型的不同, 本地代码的类型也不同。因而,编译器不仅和编程语言的种类有关, 和CPU的类型也是相关的。例如,Pentium等x86系列CPU用的C编译器, 同PowerPC这种CPU用的C编译器就不同。从另一个方面来看, 这其实是非常方便的。因为这样一来,同样的源代码就可以翻译成适用于不同CPU 的本地代码了。
因为编译器本身也是程序的一种, 所以也需要运行环境。例如,有Windows用的C编译器、 Linux用的C编译器 等。此外,还有一种交叉编译器,它生成的是和运行环境中的 CPU不同的CPU所使用的本地代码。例如,在Pentium系列CPU的 Windows这一运行环境下,也可以作成SH 及MIPS等CPU用的Windows CE ”程序,而这就是通过使用交叉编译器来实现的。
3.仅靠编译是无法得到可执行文件的
编译器转换源代码后,就会生成本地文件。 不过,本地文件是无法直接运行的。 为了得到可以运行的EXE文件, 编译之后还需要进行“链接”处理。
4.DLL文件及导入库
Windows中,API的目标文件, 并不是存储在通常的库文件中,而是存储在名为DLL (Dynamic Link Library) 文件的特殊库文件中。就如Dynamic这一名称所表示的那样,DLL 文件是程序运行时动态结合的文件。在前面的介绍中,我们提到 MessageBox()的目标文件是存储在import32.lib中的。实际上, import32.lib中仅仅存储着两个信息,一是MessageBox()在user32.dll这个DLL文件中, 另一个是存储着DLL文件的文件夹信息,MessageBox() 的目标文件的实体实际上并不存在。我们把类似于import32.lib 这样的库文件称为导入库。与此相反,存储着目标文件的实体,并直接和 EXE文件结合的库文件形式称为静态链接库。静态( static=静态的)同动态(dynamic=动态的)是相反的意思。 存储着sprintf)的目标文件的cw32lib就是静态链接库。 sprintf() 提供了通过指定格式把数值转换成字符串的功能。通过结合导入库文件,执行时从 DLL文件中调出的MessageBox(O函数这一信息就会和EXE文件进行结合。这样, 链接器链接时就不会再出现错误消息,从而就可以顺利编写EXE文件。
第八章
浙公网安备 33010602011771号