设为首页 加入收藏

TOP

11.2.3 glibc与MSVC CRT(3)
2013-10-07 00:44:57 来源: 作者: 【 】 浏览:60
Tags:11.2.3 glibc MSVC CRT

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",它们的命名规则为:

libc [p] [mt] [d] .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】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇11.2.3 glibc与MSVC CRT(4) 下一篇11.2.3 glibc与MSVC CRT(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: