/ MD,/ MT在编译目标文件时有什么区别?
我知道这些用于与msvcrt或libcmt链接。因此,基本上,他们确定在 linking 阶段将链接到哪个C库。但是它们是否以任何方式影响生成的代码?
之所以这样问,是因为我的代码可以编译为.dll
或.lib
。目前,我进行了两次构建(一次使用/MD
,一次使用/MT
)。是否有可能对此进行优化,所以我只构建一次目标文件(没有/MT
或/MD
),并且仅在链接阶段提供这些选项?
答案 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。