【PE】VS编译选项MD,MDd,MT,MTd的使用和区别
2017-10-23 11:53
267 查看
###Date: 2017/10/23
属性->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。
注意事项:
/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
一、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。
注意事项:
/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
相关文章推荐
- VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别
- VS编译选项中的MT,MTD,MD,MDD
- VC编译选项 /ML /MLd /MT /MTd /MD /MDd之间的区别
- VC编译选项 /MT /MTd /MD /MDd
- VC编译选项/MT/MTd/MD/MDd说明
- VC编译选项 md /mdd /ml /mt/mtd
- VS编译方式 \MT \MD \MTd \MDd
- VC编译选项 MT MTd MD MDd
- VC编译时: MT,MTd,MD,MDd的区别
- VS编译方式 \MT \MD \MTd \MDd
- 关于VS运行时库的选择(MDd,MD,MTd,MT,ML,MLD的使用)
- VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd)
- VC编译选项/MT/MTd/MD/MDd说明
- VC编译选项md /mdd /ml /mt/mtd
- VC编译选项 MT MTd MD MDd 全面分析
- VC编译选项 多线程(/MT) 多线程调试(/MTd) 多线程 DLL (/MD) 多线程调试 DLL (/MDd)
- vs 运行时库的选择 md /mdd /ml /mt/mtd
- Windows编程 MD(d)、MT(d)编译选项的区别
- Windows编程 MD(d)、MT(d)编译选项的区别 .
- MD(d)、MT(d)编译选项的区别————简单易懂