代码之家  ›  专栏  ›  技术社区  ›  geza

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

  •  0
  • geza  · 技术社区  · 6 年前

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

    我知道这些是用来连接msvcrt或libcmt的。所以基本上他们决定在 链接 舞台。但是它们会以任何方式影响生成的代码吗?

    我之所以这么问是因为我的代码可以编译为 .dll 或者 .lib . 目前,我构建了两个 /MD 还有一个 /MT ). 是否可以对此进行优化,因此我只构建一次对象文件(不 /公吨 /医学博士 ),并仅在链接阶段提供这些选项?

    2 回复  |  直到 6 年前
        1
  •  1
  •   geza    6 年前

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

    #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_ 前缀,它们实际上是指向真正符号的指针。

        2
  •  0
  •   Amit G.    6 年前

    /医学博士 (四)

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

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

    /公吨 (四)

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

    -

    这些编译器标志影响 .obj 文件夹。

    另见 here .