【PE】VS编译选项MD,MDd,MT,MTd的使用和区别

时间:2022-03-01 09:12:51

###Date: 2017/10/23


一、CRT编译选项的配置

编译选项的位置:

属性->C/C++->代码生成->运行库


二、编译选项的类型

(1)/MD 

使应用程序使用运行时库的多线程并特定于DLL 的版本。定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj文件中。用此选项编译的应用程序静态链接到MSVCRT.lib。该库提供允许链接器解析外部引用的代码层。实际工作代码包含在 MSVCR90.DLL, 中,该库必须在运行时对于与MSVCRT.lib 链接的应用程序可用。当/MD 与 _STATIC_CPPLIB 预处理器定义 (/D_STATIC_CPPLIB)一起使用时,您的应用程序将与静态多线程标准 C++ (libcpmt.lib) 而非动态版本 (msvcprt.lib)链接,但仍通过 msvcrt.lib 动态链接到主 CRT。
请注意,不支持_STATIC_CPPLIB 预处理器定义和 /clr 或 /clr:pure 编译器选项的组合。有关 /clr选项的限制的更多信息,请参见 /clr 限制。

(2)/MDd 
 定义_DEBUG、_MT 和 _DLL,并使应用程序使用运行时库的调试多线程并特定于 DLL 的版本。它还使编译器将库名MSVCRTD.lib 放入 .obj 文件中。

(3)/MT 
 使应用程序使用运行时库的多线程静态版本。定义_MT 并使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib解析外部符号。

(4)/MTd 
 定义_DEBUG 和 _MT。此选项还使编译器将库名 LIBCMTD.lib 放入 .obj 文件中,以便链接器使用LIBCMTD.lib 解析外部符号。

(5)/LD 
创建DLL。
将/DLL 选项传递到链接器。链接器查找 DllMain 函数,但并不需要该函数。如果没有编写 DllMain 函数,链接器将插入返回TRUE 的 DllMain 函数。
链接DLL 启动代码。
如果命令行上未指定导出(.exp) 文件,则创建导入库 (.lib);将导入库链接到调用您的 DLL的应用程序。
将/Fe(命名 EXE 文件) 解释为命名 DLL 而不是 .exe 文件;默认程序名成为基名称.dll而不是基名称.exe。
除非显式指定/MD,否则将暗指 /MT。

(6)/LDd 

创建调试DLL。定义 _MT 和 _DEBUG。

【PE】VS编译选项MD,MDd,MT,MTd的使用和区别

注意事项:

/MD表示运行时库不集成,生成的文件小,程序运行时动态加载对应的DLL;

/MT表示运行时库集成,生成的文件较大,在链接时将C/C++运行时库集成到程序中成为程序的代码。

C运行时库实际上是标准C/C++库函数的实现。VC++中的编译器提供了dll实现C/C++库函数。


三、如何选择

选/MD的理由:文件小,使用的是同一个堆,不存在A申请,B释放的问题;

选/MT的理由:移植性好,减少依赖。

参考:http://blog.csdn.net/whatday/article/details/7933133

http://blog.sina.com.cn/s/blog_6f7265cf0101nhs0.html

http://blog.csdn.net/u010059658/article/details/51026662

http://www.cnblogs.com/cuish/p/3146937.html