/ MD,/ MT在编译目标文件时有什么区别?

时间:2018-08-03 10:07:17

标签: visual-c++

/ MD,/ MT在编译目标文件时有什么区别?

我知道这些用于与msvcrt或libcmt链接。因此,基本上,他们确定在 linking 阶段将链接到哪个C库。但是它们是否以任何方式影响生成的代码?

之所以这样问,是因为我的代码可以编译为.dll.lib。目前,我进行了两次构建(一次使用/MD,一次使用/MT)。是否有可能对此进行优化,所以我只构建一次目标文件(没有/MT/MD),并且仅在链接阶段提供这些选项?

2 个答案:

答案 0 :(得分:1)

是的,这些选项会稍微影响生成的代码。看一下这个简单的代码:

#include <errno.h>

int fn() {
    return errno;
}

使用/MT,它将编译:

call    __errno
mov eax, DWORD PTR [eax]

使用/MD时:

call    DWORD PTR __imp___errno
mov eax, DWORD PTR [eax]

因此,DLL导入的符号将具有__imp_前缀,并且它们实际上是指向实际符号的指针。

答案 1 :(得分:0)

/ MD (d)

使应用程序使用运行时库的多线程特定版本和 DLL特定版本定义_MT和_DLL,并使编译器将库名称 MSVCRT.lib 放入.obj文件 [{Static library for the native CRT startup for use with DLL UCRT and vcruntime.]

使用此选项编译的应用程序静态链接到MSVCRT.lib。 该库提供了一层代码,使链接程序可以解析外部引用。实际的工作代码包含在MSVCRversionnumber.DLL中,该文件必须在运行时可用于与MSVCRT.lib链接的应用程序。

/ MT (d)

使应用程序使用运行时库的多线程静态版本定义_MT并使编译器将库名 LIBCMT.lib 放入.obj文件,以便链接程序将使用LIBCMT.lib解析外部符号。 [{Statically links the native CRT startup into your code.]

-

这些编译器标志会影响.obj文件的内容。

另请参阅here