一般情况下,在debug中生成的执行程序,本机上都可以运行,但是如果某些需求就不行。
比如写网络测试程序,自己编一个聊天程序或者穿透程序,需要别人配合,需要自己把程序发给别人来运行,当然我说的是debug版,对方又没有安装vc。直接运行的结果就是未安装运行时库。应该是缺少MSVCRxx.dll。
相对而言,我现在接触到的是2005版的vc需要的是msvcm80d.dll、msvcp80d.dll、msvcr80d.dll, 2008版是90d,2010版是100d。
就是需要把他们都加入到里面就可以了。
当然还有另一个方法就是MTd(Debug Static MultiThread)生成静态CRT。
具体类型如下:
在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。
现在我做的就是扩展功能,身为公司新人,又没有svn,只能使用debug版程序时,就会感觉到运行库的重要性了,调试程序时,各种公司内部日志库等等功能全部是debug版,需要外部调试时,经常性的不能运行,用depends工具查看,缺少run-time-library,只需要上面的方法就可以直接解决,不行就去depends查看缺少的目录在哪里,也可以直接查找。
当然需要好多dll联合运行时,dll的模式要一样。就是统一的CRT(C-run-time-library)。