11.2.3 glibc与MSVC CRT(3)
MSVC CRT
相比于相对自由分散的glibc,一直伴随着不同版本的Visual C++(www.cppentry.com)发布的MSVC CRT(Microsoft Visual C++(www.cppentry.com) C Runtime)倒看过去更加有序一些。从1992年最初的Visual C++(www.cppentry.com) 1.0版开始,一直到现在的Visual C++(www.cppentry.com) 9.0(又叫做Visual C++(www.cppentry.com) 2008),MSVC CRT也从1.0版发展到了9.0版。
同一个版本的MSVC CRT根据不同的属性提供了多种子版本,以供不同需求的开发者使用。按照静态/动态链接,可以分为静态版和动态版;按照单线程/多线程,可以分为单线程版和多线程版;按照调试/发布,可分为调试版和发布版;按照是否支持C++(www.cppentry.com)分为纯C运行库版和支持C++(www.cppentry.com)版;按照是否支持托管代码分为支持本地代码/托管代码和纯托管代码版。这些属性很多时候是相互正交的,也就是说它们之间可以相互组合。比如可以有静态单线程纯C纯本地代码调试版;也可以有动态的多线程纯C纯本地代码发布版等。但有些组合是没有的,比如动态链接版本的CRT是没有单线程的,所有的动态链接CRT都是多线程安全的。
这样的不同组合将会出现非常多的子版本,于是微软提供了一套运行库的命名方法。这个命名方法是这样的,静态版和动态版完全不同。静态版的CRT位于MSVC安装目录下的lib/,比如Visual C++(www.cppentry.com) 2008的静态库路径为"Program Files\Microsoft Visual Studio 9.0\VC\lib",它们的命名规则为:
p 表示 C Plusplus,即C++(www.cppentry.com)标准库。
mt表示 Multi-Thread,即表示支持多线程。
d 表示 Debug,即表示调试版本。
比如静态的非C++(www.cppentry.com)的多线程版CRT的文件名为libcmtd.lib。动态版的CRT的每个版本一般有两个相对应的文件,一个用于链接的.lib文件,一个用于运行时用的.dll动态链接库。它们的命名方式与静态版的CRT非常类似,稍微有所不同的是,CRT的动态链接库DLL文件名中会包含版本号。比如Visual C++(www.cppentry.com) 2005的多线程、动态链接版的DLL文件名为msvcr90.dll(Visual C++(www.cppentry.com) 2005的内部版本号为8.0)。表11-1列举了一些最常见的MSVC CRT版本(以Visual C++(www.cppentry.com) 2005为例)。
表11-1
|
文件名 < xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
相关的DLL |
属性 |
编译器选项 |
预编译宏 |
|
libcmt.lib |
无 |
多线程,静态链接 |
/MT |
_MT |
|
msvcrt.lib |
msvcr80.dll |
多线程,动态链接 |
/MD |
_MT, _DLL |
|
libcmtd.lib |
无 |
多线程,静态链接,调试 |
/MTd |
_DEBUG, _MT |
|
msvcrtd.lib |
msvcr90d.dll |
多线程,动态链接,调试 |
/MDd |
_DEBUG, _MT, _DLL |
|
msvcmrt.lib |
msvcm90.dll |
托管/本地混合代码 |
/clr |
|
|
msvcurt.lib |
msvcm90.dll |
纯托管代码 |
/clr:pure |
|
自从Visual C++(www.cppentry.com) 2005(MSVC 8.0)以后,MSVC不再提供静态链接单线程版的运行库(LIBC.lib、LIBCD.lib),因为据微软声称,经过改进后的新的多线程版的C运行库在单线程的模式下运行速度已经接近单线程版的运行库,于是没有必要再额外提供一个只支持单线程的CRT版本。
默认情况下,如果在编译链接时不指定链接哪个CRT,编译器会默认选择LIBCMT.LIB,即静态多线程CRT,Visual C++(www.cppentry.com) 2005之前的版本会选择LIBC.LIB,即静态单线程版本。关于CRT的多线程和单线程的问题,我们在后面的章节还会再深入分析。
除了使用编译命令行的选项之外,在Visual C++(www.cppentry.com)工程属性中也可以设置相关选项。如图11-9所示。
|
| (点击查看大图)图11-9 Visual C++(www.cppentry.com) 2003 .NET工程属性的截图 |
我们可以从图11-9中看到,除了多线程库以外,还有单线程静态/ML、单线程静态调试/MLd的选项。
C++(www.cppentry.com) CRT
表11-1中的所有CRT都是指C语言的标准库,MSVC还提供了相应的C++(www.cppentry.com)标准库。如果你的程序是使用C++(www.cppentry.com)编写的,那么就需要额外链接相应的C++(www.cppentry.com)标准库。这里"额外"的意思是,如表11-2所列的C++(www.cppentry.com)标准库里面包含的仅仅是C++(www.cppentry.com)的内容,比如iostream、string、map等,不包含C的标准库。
表11-2
|
文件名 |
相应DLL |
属性 |
编译选项 |
宏定义 |
|
LIBCPMT.LIB |
无 |
多线程,静态链接 |
/MT |
_MT |
|
MSVCPRT.LIB |
MSVCP90.dll |
多线程,动态链接 |
/MD |
_MT, _DLL |
|
LIBCPMTD.LIB |
无 |
多线程,静态链接,调试 |
/MTd |
_DEBUG, _MT |
|
MSVCPRTD.LIB |
MSVCP90D.dll |
多线程,动态链接,调试 |
/MDd |
_DEBUG, _MT, _DLL |
【责任编辑:
云霞 TEL:(010)68476606】