当前位置:C++技术网 > 资讯 > 编译器运行-预编译,编译,汇编,链接2

编译器运行-预编译,编译,汇编,链接2

更新时间:2016-01-16 16:43:59浏览次数:1+次

VC编译器通常把n=f(n为整数,f为浮点型)这样的赋值编译为调用_ftol函数等等。为了增强编程语言的能力,加快软件开发速度,几乎所有的编程语言都定义了相配套的函数库或类库。比如C标准定义的标准C函数,C++标准定义的C++标准类库,这些库通常被称为支持库。对于使用某一支持库变异的程序来说,支持库是它们运行的必要条件,这些程序在运行时必须可以以某种方式找到支持库。因此,支持科也被称为运行库(Run-time Library)。
为了提高使用C语言的开发软件的效率,C语言标准定义了一系列常用的函数,称为标准C库函数。但是实现的任务就留给了编译器。每个编译器实现的通常是标准C库函数的一个超集,一般称为C运行库简称CRT。具体的请看MSDN。
C++也差不多,C++标准库是由三部分组成的,第一是C标准库,第二是I/O流,第三是标准模板库,即STL。
我们写STL程序的时候,可以用dumpbin工具查看程序所依赖的库,在这里我稍微列举点,MSVCRT.DLL是VC6编译器的C运行库的DLL,MSVCP60.DLL是VC6编译器的C++标准库I/O库和STL的DLL,因为程序代码里设计到了这些库所包含的函数。在运行时就需要调用这些库。

VS编译器有两个版本,调试版本和发布版本,我们看看这些版本各自对应的DLL:

为了使编译好的程序可以顺利运行,使用运行库的程序在运行时必须找到库中的函数。实现这一目的有两种方法,一种是静态链接,另一种是动态链接。简单来说,静态链接就是将程序所使用的支持库中的函数复制到程序文件中。这样一来,这些支持库函数的实现就位于程序模块中,成为本模块的代码。动态链接就是利用动态链接库技术,在程序运行时在动态的加载包含支持函数的动态链接库,并更新程序的IAT表,是程序可以顺利的调用DLL中的支持函数。


当运行一个程序时,如果操作系统的加载器找不到他所依赖的模块,就会显示一个消息框,我想大家应该都遇到过。我们可以用过编译器选项来设置链接支持库的方式。/MT开关代表静态链接,/MD代表动态链接。如果是使用调试版本的支持库,则在后面加一个小写的d,即/MTd或/MDd。VS08之后不再支持单线程的支持库和选项。我们在VS的项目属性-》C/C++编译器-》代码生成里面就能找到对应的选项设置了。
无论是静态链接还是动态链接,都离不开lib文件。VC编译器的lib目录包含了链接器所需的各种lib文件。