/MD与/MT、/MTD与/MDD的区别

/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限制。

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

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

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

看到这里,我恍然大悟,原来这个开关就是控制这个C运行时库的引用方式的,真是踏破铁鞋无觅处得来全不费工夫。

当然到这里先别忙着去修改你的项目属性中关于这个开关的选项,因为当你的项目也是一个LIB时,如果使用了/MT或/MTd选项时,最终的静态LIB中就会出现LIBCMT.lib中的大量符号,导致在别的项目引用你的这个静态LIB时出现重复定义符号而无法链接的错误,怎么解决呢?其实继续看MSDN中的帮助就可以得到答案:传递给链接器的给定调用的所有模块都必须使用相同的运行时库编译器选项(/MD、/MT)进行编译。

原来如此,所有的模块保持一致就完了,但是静态的LIB貌似还是无法引用,问题依旧怎么办呢?那就是在引用了你自己的使用/MT或/MTd选项编译生成的静态LIB的项目中,不但指定对应的/MT或/MTd选项,而且需要忽略LIBCMT.lib库即可。

你可能感兴趣的:(C++)