VS:运行库 MT、MTd、MD、MDd

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sss_369/article/details/84337803

1. 问题

VS中开发windows程序是经常需要将编译OK的程序移到另一台机器上运行的情况,有时会出现错误;

这一般是因为另一台机器上面没有安装相应的运行库导致的,

那么运行库的选项MT、MTd、MD、MDd分别代表什么意义呢?

                               

2. 概念

这是msdn上面的解释:

MT:mutithread,多线程库,编译器会从运行库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库

MTd:mutithread+debug,多线程调试版,连接LIBMITD.lib库

MD:MT+DLL,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dll

MDd: MT+DLL+debug,多线程动态调试库,连接MSVCRTD.lib库,对应动态库为MSVCRTD.dll

开发多线程程序时,需要选择MT、MTd、MD、MDd其中的一个。

3. 结论

(1)对于MT/MTd,由于连接运行时库是LIBCMT.lib/LIBCMTD.lib,这两个库是静态库,所以此种方式编译的程序,移到另一台机器上面也可以正常运行。

(2)但是对于MD/MDd,连接的是动态库,所以如果另一台机器上没有MSVCRT.dll/MSVCRTD.dll时,就提示缺少动态库这样的错误。

曾经犯这样的错误,以为以MT/MTd方式编译,程序对所有的库都是静态链接的,其实错了,它只能决定运行时库是动态链接还是静态链接,对用户自己写的库或其他第三方库,其连接方式取决于代码(显示连接动态库Loadlibrary)或所提供的lib文件(为导入库还是静态库),移动程序到别的机器上时,还是要带上所需要的动态库的。

【注】:一个程序中混合了不同的运行库(静态库和动态库,调试库和非调试库),可能会产生冲突,所以一个程序中应该使用相同的运行时库。

参考文章:

1.  http://www.cnblogs.com/ShaneZhang/p/3480502.html

猜你喜欢

转载自blog.csdn.net/sss_369/article/details/84337803
今日推荐