CRT库功能

本主题讨论构成 C 运行时库,以及它们的关联的编译器选项和预处理器指令的各种.lib 文件。

C 运行时库 (CRT)

下列库包含的 C 运行时库函数。

(没有想起自己在 iostream 和标准 C++ 库) 的 c 运行时库

相关的 DLL

特征

选项

预处理器指令

libcmt.lib

无,静态链接。

多线程、 静态链接

/MT

_MT

msvcrt.lib

msvcr110.dll

多线程、 动态链接 (MSVCR110 导入库。DLL)。注意如果您使用标准 C++ 库,则程序将需要 MSVCP110。若要运行的 DLL。

/MD

_MT _DLL

libcmtd.lib

无,静态链接

多线程的静态链接 (调试)

/MTd

_MT _DEBUG

msvcrtd.lib

msvcr110d.dll

多线程、 动态链接 (MSVCR110D 导入库。DLL) (调试)。

/MDd

_DEBUG _MT _DLL

msvcmrt.lib

无,静态链接

C 运行时静态库。用于混合托管/本机代码。

/clr

/clr:oldSyntax

 

msvcurt.lib

无,静态链接

C 运行时静态库编译为 100%纯 MSIL 代码。所有代码都符合 ECMA URT 规范 msil。

/clr:pure

 

说明说明

单线程 CRT (libc.lib,libcd.lib) (以前称为/ML/MLd选项) 不再可用。相反,使用多线程的 CRT。请参见 多线程的库性能

如果您从命令行没有指定了 C 运行时库编译器选项的程序链接,链接器将使用 LIBCMT。LIB。这与以前版本的 Visual C++ 使用 LIBC 不同。LIB、 单线程库中,而是。

使用静态链接的 CRT 意味着将对该实例的 crt 本地保存由 C 运行时库的所有状态信息。例如,如果您使用strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l使用静态链接的 CRT 的位置时strtok分析器无关strtok代码在同一进程中 (但在不同的 DLL 或 EXE) 链接到静态 CRT 的另一个实例中使用的状态。与此相反,动态链接的 CRT 共享状态的动态链接到 CRT 的进程中的所有代码。如果您使用这些函数 ; 更安全的新版本,这一问题不适用 例如, strtok_s不会出现此问题。

通过链接到静态 CRT 生成 DLL 都有其自己的 CRT 状态,因为不建议除非这样的后果是特别需要并理解,静态链接到 CRT DLL 中。例如,如果您调用 _set_se_translator 可执行文件加载 DLL 链接到其自己的静态 CRT,生成的代码在 DLL 中的任何硬件异常就不会捕获,翻译人员,但硬件异常生成的主可执行文件中的代码将被捕捉到的。

如果您使用的**/clr编译器开关,您的代码将链接与静态库、 msvcmrt.lib。静态库提供了您的托管的代码和本机 CRT 之间的代理。您不能使用静态链接的 CRT ( /MT/MTd选项) 与/clr**。使用动态链接库 (/MD或**/MDd**) 相反。

如果您使用的**/clr:pure编译器开关,您的代码将链接与静态库 msvcurt.lib。与/clr**,您不能链接与静态链接库。

更多有关使用 CRT 与**/clr**,请参阅混合(本机和托管)程序集。 for /clr:pure, see 纯代码和可验证代码 (C++/CLI).

若要构建您的应用程序的调试版本 _DEBUG 必须定义标志,必须与某个库的调试版本链接应用程序。有关使用的库文件的调试版本的详细信息,请参阅 CRT 调试技术

此版本的Visual C++不是 C99 标准保持一致。

标准 C++ 库

标准 C++ 库

特征

选项

预处理器指令

LIBCPMT。LIB

多线程、 静态链接

/MT

_MT

MSVCPRT。LIB

多线程、 动态链接 (导入库 MSVCP110.dll)

/MD

_MT _DLL

LIBCPMTD。LIB

多线程、 静态链接

/MTd

_MT _DEBUG

MSVCPRTD。LIB

多线程、 动态链接 (MSVCP110D 导入库。DLL)

/MDd

_DEBUG _MT _DLL

注意 LIBCP。LIB 和 LIBCPD。LIB (通过旧**/ML/MLd选项) 已被删除。使用 LIBCPMT。LIB 和 LIBCPMTD。LIB 而是通过/MT/MTd**选项。

当您生成发布版本的项目,其中一个基本的 C 运行时库 (LIBCMT。LIB,MSVCMRT。LIB,MSVCRT。默认情况下链接是 LIB)、 编译器选项根据您选择 (多线程,DLL,/clr)。如果其中一个包含标头文件在代码中,标准 C++ 库链接中由Visual C++在编译时。例如:

#include <ios> 

Msvcrt.dll 和 msvcr110.dll 之间的区别是什么?

Msvcrt.dll 现在是"已知的 DLL,"这意味着它会拥有和内置的 Windows 系统组件。它旨在供将来使用仅由系统级组件。

如果应用程序使用 msvcrt.dll 和 msvcr110.dll 是否存在什么问题?

如果您有需要链接到 msvcrt.lib 的.lib 或.obj 文件,您不必重新编译它,可以使用 Visual C++ 中的新 msvcrt.lib。.Lib 或.obj 文件可能依赖的大小、 字段偏移量或各种 CRT 类或变量的成员函数名和那些应仍然存在所有兼容的方式。针对 msvcrt.lib 重新链接时最终 EXE 和 DLL 映像将现在具有依赖关系的 msvcrt.dll 而不是 msvcr110.dll。

如果您有多个 DLL 或 exe 文件,则您可能更多的 CRT,无论是否使用不同版本的Visual C++。例如,静态链接到多个 Dll 的 CRT 可以提供同样的问题。编译在指导下开发人员遇到此问题与静态 CRTs /MD使用 CRT DLL。现在,CRT DLL 已被重命名为 msvcr110.dll,则应用程序可能会与 msvcr110.dll msvcrt.dll 和其他一些组件。如果 Dll 通过 CRT 资源跨边界 msvcrt.dll 和 msvcr110.dll,您将时遇到问题,CRTs 不匹配,需要重新编译 Visual C++ 项目。

如果您的程序正在使用多个版本的 crt,小心一些需要将某些 CRT 的对象 (如文件句柄、 区域设置和环境变量) 传递时跨 DLL 边界。有关如何解决这些问题所涉及的问题的详细信息,请参阅通过在DLL边界的潜在错误CRT对象

请参见

其他资源

C运行库参考