###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。
注意事项:
/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