CRT 库功能
本主题讨论构成 C 运行时库,以及它们的关联的编译器选项和预处理器指令的各种.lib 文件。
下列库包含的 C 运行时库函数。
C运行时库(不含 iostream 和标准 C++ 库) | 相关的 DLL | 特征 | 选项 | 预处理器指令 |
---|---|---|---|---|
libcmt.lib | 无,静态链接。 | 多线程、 静态链接 | _MT | |
msvcrt.lib | msvcr110.dll | 多线程、 动态链接 (MSVCR110 导入库。DLL)。 注意如果您使用标准 C++ 库,则程序将需要 MSVCP110。若要运行的 DLL。 | _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++ 库 | 特征 | 选项 | 预处理器指令 |
---|---|---|---|
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.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 对象时可能的错误。