hechengjin 发表于 2016-8-2 14:02:51

visual studio运行时库MT、MTd、MD、MDd

本帖最后由 hechengjin 于 2016-9-6 08:57 编辑

在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装响应的运行时库导致的,那么这个与编译选项MT、MTd、MD、MDd有什么关系呢?这是msdn上面的解释:MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库MTd:mutithread+debug,多线程调试版,连接LIBMITD.lib库MD:MT+DLL,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dllMDd: MT+DLL+debug,多线程动态调试库,连接MSVCRTD.lib库,对应动态库为MSVCRTD.dll开发多线程程序时(单线程本文不做讨论),需要选择MT、MTd、MD、MDd其中的一个。
对于MT/MTd,由于连接运行时库是LIBCMT.lib/LIBCMTD.lib,这两个库是静态库,所以此种方式编译的程序,移到另一台机器上面也可以正常运行。但是对于MD/MDd,连接的是动态库,所以如果另一台机器上没有MSVCRT.dll/MSVCRTD.dll时,就提示缺少动态库这样的错误。
曾经犯这样的错误,以为以MT/MTd方式编译,程序对所有的库都是静态链接的,其实错了,它只能决定运行时库是动态链接还是静态链接,对用户自己写的库或其他第三方库,其连接方式取决于代码(显示连接动态库Loadlibrary)或所提供的lib文件(为导入库还是静态库),移动程序到别的机器上时,还是要带上所需要的动态库的。

hechengjin 发表于 2016-8-2 14:04:00

Reusable Library Switch Library Macro(s) Defined

Single Threaded/MLLIBC(none)
Static MultiThread/MTLIBCMT_MT
Dynamic Link (DLL)/MDMSVCRT_MT and _DLL
Debug Single Threaded/MLdLIBCD_DEBUG
Debug Static MultiThread/MTdLIBCMTD_DEBUG and _MT
Debug Dynamic Link (DLL)/MDdMSVCRTD_DEBUG, _MT, and _DLL


页: [1]
查看完整版本: visual studio运行时库MT、MTd、MD、MDd