您的位置:首页 > 其它

链接时如何选择C Run-Time(CRT) library

2008-07-11 14:28 232 查看

链接时如何选择C Run-Time(CRT) library

链接时如何选择C Run-Time(CRT) library


原文转自: http://blog.vckbase.com/michael/archive/2005/06/30/9000.html

在Windows下有六种类型CRTLib(C运行库):

Reusable Library Switch Library Macro(s) Defined

----------------------------------------------------------------

Single Threaded /ML LIBC (none)

Static MultiThread /MT LIBCMT _MT

Dynamic Link (DLL) /MD MSVCRT _MT and _DLL

Debug Single Threaded /MLd LIBCD _DEBUG

Debug Static MultiThread /MTd LIBCMTD _DEBUG and _MT

Debug Dynamic Link (DLL) /MDd MSVCRTD _DEBUG, _MT, and _DLL

MT和MD都适用于多线程,其区别是:

MT为静态链接CRT,这样编译出来exe是自包含的,所以会相对大一些,但运行时不用再load CRT库。

MD为动态链接CRT,编译出来exe会小一些,运行时需要load CRT,性能有一点点损失。

任何工程都应该使用同样的CRT Library。即要么都是/ML,要么都是/MTD, 如此类推。

如果一个程序中混合使用不同类型的CRT,有时可以通过link,这样会存在不同CRT的copy,并导致以下问题:

1)在一个lib中new出来内存,在另一个lib中delete,会crash。

2)不能在多个lib中共享file handle。

3)一个lib中设置locale(本地化有关),不能在另一个lib中起作用。

当工程比较大,包含的lib很多,特别当有外部lib(Third party library)存在时,link很容易发生下面这样的错误。

LIBCMTD.lib(chsize.obj) : error LNK2005: __chsize already defined in MSVCRTD.lib(MSVCRTD.dll)

这说明,你的工程使用了不同类型的CRT。这个时候首先一定要坚信这个原则:整个工程用同样的CRT Lib就可以解决问题。然后耐心一一检查每个lib。

如果恰恰某个外部lib用MT,另一个用MD,这个时候就比较痛苦。

如果有他们源码,就编译一个MT or MD类型的lib,以统一使用一个类型CRT。

如果没有,那可能只好选择其他的lib。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: