CRT Library Features

The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found atCRT Library Features.

This topic discusses the various .lib files that comprise the C run-time libraries as well as their associated compiler options and preprocessor directives.

本主题将介绍各种 .lib 文件,包括 C 运行时库及其关联的编译器选项和预处理器指令。

C 运行时库 (CRT)

C 运行时库 (CRT) 是集成了 ISO C99 标准库的 C++ 标准库。 实现 CRT 的 Visual C++ 库支持用于 .NET 开发的本机代码开发以及本机和托管混合代码。 所有版本的 CRT 都支持多线程开发。 大多数的库都支持通过静态链接将库直接链接到代码中,或通过动态链接让代码使用常用 DLL 文件。

从 Visual Studio 2015 开始,CRT 已被重构为新的二进制文件。 通用 CRT (UCRT) 包含通过标准 C99 CRT 库导出的函数和全局函数。 UCRT 现为 Windows 组件,并作为 Windows 10 的一部分提供。 静态库、DLL 导入库和 UCRT 的头文件现在 Windows 10 SDK 中提供。 安装 Visual C++ 时,Visual Studio 安装程序将安装使用 UCRT 所需 Windows 10 SDK 的子集。 可以在 Visual Studio 2015 及更高版本支持的任何 Windows 版本上使用 UCRT。 可以使用 vcredist 重新分发它,以便支持 Windows 10 以外的 Windows 版本。 有关详细信息,请参阅 Redistributing Visual C++ Files。

下表列出了实现 UCRT 的库。

库 关联的 DLL 特征 选项 预处理器指令

libucrt.lib 无 将 UCRT 静态链接到你的代码。 /MT _MT

libucrtd.lib 无 用于静态链接的 UCRT 调试版本。 不可再发行。 /MTd _DEBUG, _MT

ucrt.lib ucrtbase.dll UCRT 的 DLL 导入库。 /MD _MT, _DLL

ucrtd.lib ucrtbased.dll UCRT 调试版本的 DLL 导入库。 不可再发行。 /MDd _DEBUG, _MT, _DLL

vcruntime 库包含 Visual C++ CRT 实现特定的代码,例如异常处理和调试支持、运行时检查和类型信息、实现的详细信息和某些扩展的库函数。 此库特定于所用编译器的版本。

此表列出了实现 vcruntime 库的库。

库 关联的 DLL 特征 选项 预处理器指令

libvcruntime.lib 无 静态链接到你的代码。 /MT _MT

libvcruntimed.lib 无 用于静态链接的调试版本。 不可再发行。 /MTd _MT, _DEBUG

vcruntime.lib vcruntime.dll vcruntime 的 DLL 导入库。 /MD _MT, _DLL

vcruntimed.lib vcruntimed.dll 调试 vcruntime 的 DLL 导入库。 不可再发行。 /MDd _DEBUG, _MT, _DLL

初始化 CRT 的代码是几个库中的一个,根据 CRT 库是采用静态或动态链接还是本机、托管或混合代码而定。 此代码处理 CRT 启动、内部逐线程数据初始化和终止。 它特定于所用编译器的版本。 此库始终采用动态链接,即使使用动态链接的 UCRT 也是如此。

此表列出了实现 CRT 初始化和终止的库。

库 特征 选项 预处理器指令

LIBCMT.lib 将本机 CRT 启动静态链接到你的代码。 /MT _MT

libcmtd.lib 静态链接本机 CRT 启动的调试版本。 不可再发行。 /MTd _DEBUG, _MT

msvcrt.lib 与 DLL UCRT 和 vcruntime 一起使用的本机 CRT 启动的静态库。 /MD _MT, _DLL

msvcrtd.lib 与 DLL UCRT 和 vcruntime 一起使用的本机 CRT 启动调试版本的静态库。 不可再发行。 /MDd _DEBUG, _MT, _DLL

msvcmrt.lib 与 DLL UCRT 和 vcruntime 一起使用的本机和托管混合 CRT 启动的静态库。 /clr

msvcmrtd.lib 与 DLL UCRT 和 vcruntime 一起使用的本机和托管混合 CRT 启动调试版本的静态库。 不可再发行。 /clr

msvcurt.lib 纯托管 CRT 的已弃用静态库。 /clr:pure

msvcurtd.lib 纯托管 CRT 调试版本的已弃用静态库。 不可再发行。 /clr:pure

如果从没有编译器选项(可指定 C ++运行时库)的命令行链接程序,则链接器将使用静态链接的 CRT 库:libcmt.lib、libvcruntime.lib 和 libucrt.lib。

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

由于通过链接到静态 CRT 构建的 DLL 将具有其自己的 CRT 状态,因此不建议以静态方式链接到 DLL 中的 CRT,除非特别需要和需了解这一后果。 例如,如果在加载 DLL(链接到其自己的静态 CRT)的可执行文件中调用 _set_se_translator ,则转换器将不会捕获由 DLL 中的代码生成的任何硬件异常,但会捕获由主可执行文件中的代码生成的硬件异常。

如果使用 /clr 编译器开关,则将通过静态库 msvcmrt.lib 链接代码。 静态库将提供托管的代码和本机 CRT 之间的代理。 你无法使用静态链接的 CRT( /MT 或 /MTd 选项)和 /clr。 请改用动态链接的库(/MD 或 /MDd)。 纯托管的 CRT 库在 Visual Studio 2015 中已弃用并在 Visual Studio 2017 中不受支持。

有关将 CRT 与 /clr 配合使用的详细信息,请参阅混合(本机和托管)程序集。

若要生成你的应用程序的调试版本,则必须定义 _DEBUG 标志,并且该应用程序必须与其中一个调试版本的库链接。 有关使用调试版本的库文件的详细信息,请参阅 CRT 调试技术。

此版本的 CRT 不完全符合 C99 标准。 具体而言,不支持 <tgmath.h> 标头和 CX_LIMITED_RANGE/FP_CONTRACT pragma 宏。 某些元素(如标准 IO 函数中参数说明符的含义)默认采用旧的解释。 可以使用 /Zc 编译器一致性选项并指定链接器选项来控制库一致性的某些方面。

C++ 标准库

C++ 标准库 特征 选项 预处理器指令

libcpmt.lib 多线程, 静态链接 /MT _MT

msvcprt.lib 多线程动态链接(MSVCPversion.dll 的导入库) /MD _MT, _DLL

libcpmtd.lib 多线程, 静态链接 /MTd _DEBUG, _MT

msvcprtd.lib 多线程动态链接(MSVCPversionD.DLL 的导入库) /MDd _DEBUG, _MT, _DLL

当构建项目的发行版时,默认情况下,将链接其中一个基本 C 运行时库(libcmt.lib、msvcmrt.lib、msvcrt.lib),具体取决于你选择的编译器选项(多线程、DLL、/clr)。 如果在代码中包含其中一个 C++ 标准库标头文件,则将在编译时通过 Visual C++ 自动链接 C++ 标准库。 例如:

#include <ios>

对于二进制兼容性,可通过单个导入库指定多个 DLL 文件。 版本更新可能会引入点库,点库是引入新的库功能的 单独的 Dll。 例如,Visual Studio 2017 版 15.6 引入了 msvcp140_1.dll 以支持其他标准库功能,而不会破坏由 msvcp140.dll 支持的 ABI。 适用于 Visual Studio 2017 版本 15.6 的工具集中包含的 msvcprt.lib 导入库支持两个 DLL,且此版本的 vcredist 安装两个 DLL。 传送后,点库具有固定 ABI,且不会在以后的点库中包含依赖项。

如果应用程序使用多个 CRT 版本,将存在什么问题?

每个可执行映像(EXE 或 DLL)可以具有其自己静态链接的 CRT,或可以动态链接到 CRT。 静态包括在某个映像中或某个映像动态加载的 CRT 版本取决于构建 该 CRT 时采用的工具和库。 单个进程可能会加载多个 EXE 和 DLL 映像,每个都有其自己的 CRT。 每个 CRT 可能使用不同的分配器,可能具有不同的内部结构布局,可能使用不同的存储排列方式。 这意味着,分配的内存、CRT 资源或跨 DLL 边界传递的类可能会导致内存管理、内部静态使用情况或布局解释方面的问题。 例如,如果在一个 DLL 中分配类,但将其传递给另一个 DLL 或由另一个 DLL 删除,那么使用了哪个 CRT 释放器? 导致的错误程度可以从微小到立即致命,因此强烈建议不要直接传输此类资源。

你可以使用应用程序二进制接口 (ABI) 技术避免这些问题,因为此技术被设计成稳定且版本可控。 设计 DLL 导出接口以按值传递信息,或致力于调用方传入而非本地分配并返回给调用方的内存。 使用封送技术复制可执行映像之间的结构化数据。 本地封装资源并仅允许通过向客户端公开的句柄或函数操作。

如果进程中的所有映像全都使用相同的 CRT 动态加载版本,则也有可能避免这些问题。 若要确保所有组件都使用相同的 CRT 的 DLL 版本,请使用“/MD”选项,并使用相同的编译器工具集和属性设置进行构建。

如果程序跨 DLL 边界传递某些 CRT 资源(如文件句柄、区域设置和环境变量),即便使用的是相同版本的 CRT,那也需要注意。 有关所涉及问题以及如何解决这些问题的详细信息,请参阅跨 DLL 边界传递 CRT 对象时可能的错误。

CRT Library Features的更多相关文章

  1. [Android Tips] 22. Available Java 7 Features in Android

    This only allows Java 7 language features, and you can hardly benefit from anything since a half of ...

  2. Support Library官方教程(3)android studio中导入支援包

    Support Library Setup How you setup the Android Support Libraries in your development project depend ...

  3. Support Library官方教程(2)各支援包的特性详介(含表)*

    快速阅读 包名  作用  位置 是否有资源 v4 提供了最多的api <sdk>/extras/android/support/v4/ y Multidex 把DEX文件生成apk < ...

  4. Support Library官方教程(1)概述

    Support Library The Android Support Library package is a set of code libraries that provide backward ...

  5. FGX Native library功能介绍

    Hot news from the fields of the cross-platform library "FGX Native" development. New Engli ...

  6. 默认库“library”与其他库的使用冲突;使用 /NODEFAULTLIB:library

    您试图与不兼容的库链接. 重要事项 运行时库现在包含防止混合不同类型的指令.如果试图在同一个程序中使用不同类型的运行时库或使用调试和非调试版本的运行时库,则将收到此警告.例如,如果编译一个文件以使用一 ...

  7. Ten C++11 Features Every C++ Developer Should Use

    原版:http://www.codeproject.com/Articles/570638/Ten-Cplusplus-Features-Every-Cplusplus-Developer 译版:ht ...

  8. 【转】Android Support Library详细介绍

    网上对Android Support Library中各个依赖包介绍的中文资料太少了,结合官方文档和有限的参考资料做了一次总结,有描述得不对的地方还请指正. 一.主工程.依赖包.jar包.androi ...

  9. List of features and minimum Clang version with support

    #1: C++11 Language Feature C++11 Proposal Available in Clang? Rvalue references N2118 Clang 2.9      ...

随机推荐

  1. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

  2. [转载]Java web应用中的常见字符编码问题的解决方法

    以下是 Java web应用的常见编码问题 1. html页面的编码 在web应用中,通常浏览器会根据http header: Content-type的值来决定用什么encoding, 比如遇到Co ...

  3. python3 计算文件夹中所有py文件里面代码行数,注释行数,空行数

    import os,re #代码所在位置 FILE_PATH = './' def analyze_code(codefilesource): ''' 打开一个py文件统计其中的代码行数,包括空格和注 ...

  4. CSS选择器(二)

    五.属性选择器. 属性选择器可以根据元素的属性及属性值来选择元素. 简单属性选择 如果希望选择有某个属性的元素,而不论属性值是什么,可以使用简单属性选择器. 例子 1 如果您希望把包含标题(title ...

  5. PAT 天梯赛 L2-005. 集合相似度 【SET】

    题目链接 https://www.patest.cn/contests/gplt/L2-005 思路 因为集合中的元素 是不重复的 所以用SET 来保存 集合 然后最后 查找一下 两个集合中共有元素 ...

  6. 使用MAVEN手动创建web项目

    问题:如下图,使用maven创建webapp项目时,默认使用maven-archetype-webapp这个archetype,由于这个archetype比较古老,有如下缺点: 1. 默认生成的项目会 ...

  7. Data Structure Trie: suffix problem

    http://www.geeksforgeeks.org/suffix-array-set-1-introduction/ http://www.geeksforgeeks.org/pattern-s ...

  8. [原创]java WEB学习笔记23:MVC案例完整实践(part 4)---模糊查询的设计与实现

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  9. 在ubuntu上为android系统编写Linux驱动程序【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/6568411 在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的 ...

  10. 吴恩达机器学习笔记(三) —— Regularization正则化

    主要内容: 一.欠拟合和过拟合(over-fitting) 二.解决过拟合的两种方法 三.正则化线性回归 四.正则化logistic回归 五.正则化的原理 一.欠拟合和过拟合(over-fitting ...