为了提高使用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文件。