Visual Studio 代码生成 运行时库的选择
运行时库的选项有:多线程(/MT)、多线程调试(/MTD)、多线程DLL(/MD)、多线程调试(/MDd) 有时调用外部的一些库,这个选择不对,老编译不通过;
C Runtime Library:
|
C++ Standard Library:
开关 | 对应的库 | 版本 |
/MD | MSVCPRT.LIB | 多线程DLL的Release版本 |
/MDd | MSVCPRTD.LIB | 多线程DLL的Debug版本 |
/MT | LIBCPMT.LIB | 多线程静态链接的Release版本 |
/MTd | LIBCPMTD.LIB | 多线程静态链接的Debug版本 |
各种C运行库的区别:
- 静态链接的单线程库
只能用于单线程的应用程序,C运行时库的目标代码最终被编译在二进制文件中。通过/ML编译选项可以设置Visual c++使用静态链接的单线程库。 - 静态链接的多线程库
静态链接的多线程库的目标代码也最终被编译在应用程序的二进制文件中,但是它可以在多线程应用程序中使用。通过/MT编译选项可以设置Visual c++ 使用静态链接库的多线程库。 - 动态链接的运行时库
动态连接的运行时库将所有的c库函数保存在一个单独的动态链接库MSVCRxx.DLL中,其处理了多线程问题。使用/MD编译选项可以设置Visual c++使用动态链接的运行时库。
静态链接的目标代码最终都会被编译在应用程序的二进制文件中
/MDd、/MTd选项使用Debug runtime library(调试版本的运行时刻函数库),与/MD、MT对应为release版本。debug版本的Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,将强了错误的检测,因此性能方面比不上release版本。
选项 | 说明 |
---|---|
/MD | 使此应用程序使用特定于多线程和 DLL 的运行库版本。 定义 _MT 和 _DLL,并使编译器将库名 MSVCRT.lib 放入 .obj 文件中。 用此选项编译的应用程序静态链接到 MSVCRT.lib。 此库提供使链接器能够解析外部引用的代码的层。 实际工作代码包含在 MSVCRversionnumber.DLL 中,后者必须在运行时对与 MSVCRT.lib 链接的应用程序可用。 |
/MDd | 定义 _DEBUG、_MT 和 _DLL,并使此应用程序使用特定于多线程和 DLL 的调试版本的运行库。 它还会让编译器将库名称 MSVCRTD.lib 放入 .obj 文件中。 |
/MT | 使此应用程序使用运行库的多线程的静态版本。 定义 _MT,并使编译器将库名 LIBCMT.lib 放入 .obj 文件中,以便链接器使用 LIBCMT.lib 解析外部符号。 |
/MTd | 定义 _DEBUG 和 _MT。 此选项还会让编译器将库名称 LIBCMTD.lib 放置到 .obj 文件中,以便链接器将使用 LIBCMTD.lib 来解析外部符号。 |
/LD | 创建一个 DLL。 将 /DLL 选项传递到链接器。 链接器查找 DllMain 函数,但并不需要该函数。 如果没有编写 DllMain 函数,则链接器将插入返回 TRUE 的 DllMain 函数。 链接 DLL 启动代码。 如果未在命令行上指定导出 (.exp) 文件,则创建导入库 (.lib)。 将导入库链接到调用 DLL 的应用程序。 将 /Fe(命名 EXE 文件) 解释为命名 DLL 而不是 .exe 文件。 默认情况下,程序名会变成 basename.dll 而不是 basename.exe。 除非显式指定 /MD,否则将暗指 /MT。 |
/LDd | 创建调试 DLL。 定义 _MT 和 _DEBUG。 |