本文是对http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html的翻译,若有错误,还请指正html
c/c++运行库(runtime library)包括许多基本的功能,像内存分配、输出和字符串操做(复制、计算长度)等等c++
当创建了一个c/c++的应用程序或库时,你必须选中c/c++运行库,在vs2005中,你能够这样选中这种按钮:Project->Properties...->Configuration Properties->C/C++->Code Generation->Runtime Library:安全
这里有4种选择:多线程
1 多线程(/MT)app
2 多线程调试(/MTD)ui
3 多线程动态连接库dll(/MD)线程
4 多线程动态连接库调试(/MDD)翻译
c++的运行库依赖于c的运行库。c的运行库版本必须和c++的运行库版本匹配。所以,这些选项应用于c和c++的运行库中。debug
在以前vs的版本中,这些都是单线程的。那些版本会比多线程的执行的速度更快。可是,在多线程的应用程序中,用他们并不安全。我想,单线程库在减小是由于多核如今已经成为广泛的存在。并且多线程应用程序须要利用多核。调试
(In previous versions of Visual Studio, you had additional options that were single-threaded. These versions would execute faster on a single core than the multi-threaded versions. However, they were not safe to use in a multi-threaded application. I'm guessing these libraries were dropped since multiple cores are quickly becoming ubiquitous and multi-threaded applications are needed to take advantage of these extra cores.)
这两种变量会有四种选择
第一种变量很简单,在不交给顾客的内部软件中应用调试版。调试的运行库不能合法的包含你的应用程序。这么说吧,你不能将软件的debug版本交给顾客。它应该是运行库的release版本
debug运行库让你会的一些有用的调试帮助,好比错误报告和跟踪内存泄露,想了解更多的debug功能,请看http://msdn.microsoft.com/en-us/library/zh712wwf%28VS.80%29.aspx
下一个变量就是动态连接库(dll)或静态库了。一般来讲,咱们应当使用dll,当出现下面请看时,你能够考虑静态库版本:
当你的应用程序不须要其余库时这些指令运行的很是好。但这不多发生。在应用程序中使用多余一个运行库版本Microsoft列出了几点模糊的警告在他们的文档里。
目的就是在你的整个应用程序里只使用一种运行库。
但这几乎不可能由于由于你对别的类库用了什么库时没有权限的。好比说,openGL(open graphic library)须要使用类库。若是你的应用程序或是使用的其余类库没有和openGL使用一样的类库,那么你就在同时用着几个类库。
咱们怎么知道某个exe,dll,lib,obj使用了哪一个类库呢,使用下面这条命令:、
dumpbin /all XXXX | find /i "msvcr"
XXX表示你想知道的exe/dll/lib/obj
想知道运行的结果表明什么,可参照:http://msdn.microsoft.com/en-us/library/abx4dbyh.aspx
若是你什么也没获得,极可能你如今用的是一个静态库。
甚至在你知道用的是哪一个运行库,你会发现要使得应用程序只用一个运行库也是不可能的。若是若是你匹配运行库,会发现,有可能一个类库用的是vs7.0的版本(msvct.dll)可是你只能访问vs8.0的类库。
因此,除了某些特定状况,类库混在一块儿用关系不大。一个好的类库应该避开这些状况,而后类库匹配的时候就没多大关系了。