vs MD /MDD /ML /MT /MTD的简单介绍

时间:2021-11-20 08:43:21

    在编译ATL工程后,生成的dll在本电脑上能用,在别人的电脑上不能用。通过Depends工具分析一下,原来是编译选项没有选对,别的电脑上没有我生成的dll需要的基础dll文件,选成静态链接库就好了。故而总结一下几个编译选项,主要来自于参考1中链接网址;当然,更详细的介绍可以参见参考2microsoft网址上介绍。

1VC编译选项 多线程(/MT)

多线程调试(/MTd)

多线程 DLL (/MD)

多线程调试 DLL (/MDd)

2C 运行时库                        库文件

Single thread(static link) ML            libc.lib

Debug single thread(static link) MLd        libcd.lib

MultiThread(static link) MT            libcmt.lib

Debug multiThread(static link) MTd            libcmtd.lib

MultiThread(dynamic link) MD            msvert.lib

Debug multiThread(dynamic link) MDd        msvertd.lib

3. 各种 C 运行时库的区别

(1)静态链接的单线程库

    静态链接的单线程库只能用于单线程的应用程序,C运行时库的目标代码最终被编译在应用程序的二进制文件中。通过/ML编译选项可以设置Visual C++使用静态链接的单线程库。

(2)静态链接的多线程库

    静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程程序中使用。通过 /MT 编译选项可以设置 Visual C++ 使用静态链接的多线程库。

(3)动态链接的运行时库

    动态链接的运行时库将所有的 C 库函数保存在一个单独的动态链接库 MSVCRTxx.DLL中,MSVCRTxx.DLL 处理了多线程问题。使用 /MD 编译选项可以设置 Visual C++ 使用动态链接的运行时库。

/MDd、/MLd 或 /MTd 选项使用 Debug runtime library( 调试版本的运行时刻函数库 ) ,与 /MD 、 /ML 或 /MT 分别对应。 Debug 版本的 Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,加强了对错误的检测,因此在运行性能方面比不上 Release 版本。

Warning:不要混合使用运行时库的静态版本和动态版本。在一个进程中有多个运行时库副本会导致问题,因为副本中的静态数据不与其他副本共享。链接器禁止在 .exe 文件内部既使用静态版本又使用动态版本链接,但仍可以使用运行时库的两个(或更多)副本。例如,当与用动态 (DLL) 版本的运行时库链接的.exe文件一起使用时,用静态(非DLL)版本的运行时库链接的动态链接库可能导致问题。(还应该避免在一个进程中混合使用这些库的调试版本和非调试版本)。

参考:

[1] http://www.cnblogs.com/eddyshn/archive/2009/11/23/1608823.html

[2] http://msdn.microsoft.com/en-us/library/aa278396%28VS.60%29.aspx