Особенности библиотеки CRTCRT Library Features

В этом разделе обсуждаются различные LIB-файлы, входящие в библиотеки времени выполнения C, а также связанные параметры компилятора и директивы препроцессора.This topic discusses the various .lib files that comprise the C run-time libraries as well as their associated compiler options and preprocessor directives.

Библиотеки среды выполнения C (CRT)C Run-Time Libraries (CRT)

Библиотека времени выполнения C (CRT) является частью стандартной библиотеки C++, содержащей библиотеку C99 стандарта ISO.The C Run-time Library (CRT) is the part of the C++ Standard Library that incorporates the ISO C99 standard library. Библиотеки Visual C++, которые реализуют CRT, поддерживают разработку с использованием машинного кода, а также сочетания машинного и управляемого кода.The Visual C++ libraries that implement the CRT support native code development, and both mixed native and managed code. Все версии библиотек CRT поддерживают разработку многопоточного кода.All versions of the CRT support multi-threaded development. Большинство библиотек поддерживает как статическое связывание (для связывания библиотеки непосредственно в коде), так и динамическое связывание (для использования в коде общих библиотек DLL).Most of the libraries support both static linking, to link the library directly into your code, or dynamic linking to let your code use common DLL files.

Начиная с Visual Studio 2015, был проведен рефакторинг CRT, повлекший создание новых двоичных файлов.Starting in Visual Studio 2015, the CRT has been refactored into new binaries. Универсальная библиотека CRT (UCRT) содержит функции и глобальные переменные, экспортируемые стандартной библиотекой CRT C99.The Universal CRT (UCRT) contains the functions and globals exported by the standard C99 CRT library. UCRT теперь является компонентом Windows и поставляется в составе Windows 10.The UCRT is now a Windows component, and ships as part of Windows 10. Статическая библиотека, DLL-библиотека импорта и файлы заголовков для UCRT теперь входят в пакет SDK для Windows 10.The static library, DLL import library, and header files for the UCRT are now found in the Windows 10 SDK. При установке Visual C++ программа установки Visual Studio устанавливает набор компонентов из пакета SDK для Windows 10, необходимых для использования UCRT.When you install Visual C++, Visual Studio setup installs the subset of the Windows 10 SDK required to use the UCRT. Библиотеку UCRT можно использовать в любой версии Windows, поддерживаемой Visual Studio 2015 и более поздними версиями.You can use the UCRT on any version of Windows supported by Visual Studio 2015 and later versions. Ее можно распространять с помощью vcredist для поддерживаемых версий Windows (кроме Windows 10).You can redistribute it using vcredist for supported versions of Windows other than Windows 10. Дополнительные сведения см. в разделе Redistributing Visual C++ Files.For more information, see Redistributing Visual C++ Files.

В следующей таблице перечислены библиотеки, которые реализуют UCRT.The following table lists the libraries that implement the UCRT.

БиблиотекаLibrary Связанная DLLAssociated DLL ХарактеристикиCharacteristics ПараметрOption Директивы препроцессораPreprocessor directives
libucrt.liblibucrt.lib НетNone Статически связывает UCRT в коде.Statically links the UCRT into your code. /MT/MT _MT_MT
libucrtd.liblibucrtd.lib НетNone Отладочная версия UCRT для статического связывания.Debug version of the UCRT for static linking. Нераспространяемый компонент.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
ucrt.libucrt.lib ucrtbase.dllucrtbase.dll DLL-библиотека импорта для UCRT.DLL import library for the UCRT. /MD/MD _MT, _DLL_MT, _DLL
ucrtd.libucrtd.lib ucrtbased.dllucrtbased.dll DLL-библиотека импорта для отладочной версии UCRT.DLL import library for the Debug version of the UCRT. Нераспространяемый компонент.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

Библиотека vcruntime содержит код Visual C++, определяемый реализацией CRT (такой как поддержка обработки исключений и отладки), проверки времени выполнения, сведения о типах, сведения о реализации и некоторые расширенные функции библиотеки.The vcruntime library contains Visual C++ CRT implementation-specific code, such as exception handling and debugging support, runtime checks and type information, implementation details and certain extended library functions. Эта библиотека определяется версией используемого компилятора.This library is specific to the version of the compiler used.

В этой таблице перечислены библиотеки, которые реализуют библиотеку vcruntime.This table lists the libraries that implement the vcruntime library.

БиблиотекаLibrary Связанная DLLAssociated DLL ХарактеристикиCharacteristics ПараметрOption Директивы препроцессораPreprocessor directives
libvcruntime.liblibvcruntime.lib НетNone Статически связанная с кодом.Statically linked into your code. /MT/MT _MT_MT
libvcruntimed.liblibvcruntimed.lib НетNone Отладочная версия для статического связывания.Debug version for static linking. Нераспространяемый компонент.Not redistributable. /MTd/MTd _MT, _DEBUG_MT, _DEBUG
vcruntime.libvcruntime.lib vcruntime<version>.dllvcruntime<version>.dll DLL-библиотека импорта для vcruntime.DLL import library for the vcruntime. /MD/MD _MT, _DLL_MT, _DLL
vcruntimed.libvcruntimed.lib vcruntime<version>d.dllvcruntime<version>d.dll DLL-библиотека импорта для отладочной версии vcruntime.DLL import library for the Debug vcruntime. Нераспространяемый компонент.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

Примечание

Когда был сделан рефакторинг UCRT, функции среды выполнения с параллелизмом были перемещены в файл concrt140.dll, который является частью распространяемого пакета C++.When the UCRT refactoring occurred, the Concurrency Runtime functions were moved into concrt140.dll, which was added to the C++ redistributable package. Эта библиотека DLL необходима для параллельных контейнеров и алгоритмов C++, таких как concurrency::parallel_for.This DLL is required for C++ parallel containers and algorithms such as concurrency::parallel_for. Кроме того, стандартная библиотека C++ требует эту библиотеку DLL в Windows XP для поддержки примитивов синхронизации, так как Windows XP не поддерживает переменные условия.In addition, the C++ Standard Library requires this DLL on Windows XP to support synchronization primitives, because Windows XP does not have condition variables.

Код, инициализирующий CRT, находится в одной из нескольких библиотек в зависимости от статического или динамического связывания библиотеки CRT и использования машинного, управляемого или смешанного кода.The code that initializes the CRT is in one of several libraries, based on whether the CRT library is statically or dynamically linked, or native, managed, or mixed code. Этот код обрабатывает запуск, инициализацию внутренних данных потоков и завершение CRT.This code handles CRT startup, internal per-thread data initialization, and termination. Он определяется версией используемого компилятора.It is specific to the version of the compiler used. Эта библиотека всегда статически связана, даже при использовании динамически связанной библиотеки UCRT.This library is always statically linked, even when using a dynamically linked UCRT.

В этой таблице перечислены библиотеки, которые реализуют инициализацию и завершение CRT.This table lists the libraries that implement CRT initialization and termination.

БиблиотекаLibrary ХарактеристикиCharacteristics ПараметрOption Директивы препроцессораPreprocessor directives
LIBCMT.liblibcmt.lib Статически связывает в коде запуск CRT машинного кода.Statically links the native CRT startup into your code. /MT/MT _MT_MT
libcmtd.liblibcmtd.lib Статически связывает отладочную версию запуска CRT в машинном коде.Statically links the Debug version of the native CRT startup. Нераспространяемый компонент.Not redistributable. /MTd/MTd _DEBUG, _MT_DEBUG, _MT
msvcrt.libmsvcrt.lib Статическая библиотека для запуска CRT в машинном коде для использования с DLL, UCRT и vcruntime.Static library for the native CRT startup for use with DLL UCRT and vcruntime. /MD/MD _MT, _DLL_MT, _DLL
msvcrtd.libmsvcrtd.lib Статическая библиотека для запуска отладочной версии CRT в машинном коде для использования с DLL, UCRT и vcruntime.Static library for the Debug version of the native CRT startup for use with DLL UCRT and vcruntime. Нераспространяемый компонент.Not redistributable. /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL
msvcmrt.libmsvcmrt.lib Статическая библиотека для запуска CRT в смешанном машинном и управляемом коде для использования с DLL, UCRT и vcruntime.Static library for the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. /clr/clr
msvcmrtd.libmsvcmrtd.lib Статическая библиотека для запуска отладочной версии CRT в смешанном машинном и управляемом коде для использования с DLL, UCRT и vcruntime.Static library for the Debug version of the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. Нераспространяемый компонент.Not redistributable. /clr/clr
msvcurt.libmsvcurt.lib Нерекомендуемая статическая библиотека для CRT с полностью управляемым кодом.Deprecated Static library for the pure managed CRT. /clr:pure/clr:pure
msvcurtd.libmsvcurtd.lib Нерекомендуемая статическая библиотека для отладочной версии CRT с полностью управляемым кодом.Deprecated Static library for the Debug version of the pure managed CRT. Нераспространяемый компонент.Not redistributable. /clr:pure/clr:pure

При ссылке программы из командной строки без параметра компилятора, задающего библиотеку выполнения C, компоновщик будет использовать статически связанные библиотеки CRT: libcmt.lib, libvcruntime.lib и libucrt.lib.If you link your program from the command line without a compiler option that specifies a C run-time library, the linker will use the statically linked CRT libraries: libcmt.lib, libvcruntime.lib, and libucrt.lib.

Использование статически скомпонованных CRT означает, что все сведения о состоянии, сохраненные библиотекой времени выполнения C, будут локальны по отношению к этому экземпляру CRT.Using the statically linked CRT implies that any state information saved by the C runtime library will be local to that instance of the CRT. Например, если применяется strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l при использовании статически скомпонованной CRT, позиция анализатора strtok не связана с состоянием strtok, которое используется в коде в этом же процессе (но в другом файле DLL или EXE), скомпонованном с другим экземпляром статической библиотеки CRT.For example, if you use strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l when using a statically linked CRT, the position of the strtok parser is unrelated to the strtok state used in code in the same process (but in a different DLL or EXE) that is linked to another instance of the static CRT. Напротив, динамически скомпонованная библиотека CRT позволяет использовать состояние всему коду в процессе, который динамически скомпонован с этой библиотекой CRT.In contrast, the dynamically linked CRT shares state for all code within a process that is dynamically linked to the CRT. Это не относится к новым более безопасным версиям этих функций; например, эта проблема не распространяется на strtok_s .This concern does not apply if you use the new more secure versions of these functions; for example, strtok_s does not have this problem.

Поскольку библиотека DLL, собранная путем компоновки со статической библиотекой CRT, будет иметь собственное состояние CRT, не рекомендуется использовать статическую компоновку с CRT для DLL без понимания последствий и конкретной необходимости.Because a DLL built by linking to a static CRT will have its own CRT state, it is not recommended to link statically to the CRT in a DLL unless the consequences of this are specifically desired and understood. Например, при вызове функции _set_se_translator в исполняемом файле, который загружает библиотеку DLL, скомпонованную с собственной статической библиотекой CRT, все аппаратные исключения, создаваемые в коде библиотеки DLL, не будут перехватываться транслятором, в отличие от аппаратных исключений, создаваемых в коде основного исполняемого файла.For example, if you call _set_se_translator in an executable that loads the DLL linked to its own static CRT, any hardware exceptions generated by the code in the DLL will not be caught by the translator, but hardware exceptions generated by code in the main executable will be caught.

Если используется параметр компилятора /clr , код будет скомпонован со статической библиотекой msvcmrt.lib.If you are using the /clr compiler switch, your code will be linked with a static library, msvcmrt.lib. Эта статическая библиотека предоставляет функцию прокси между управляемым кодом и неуправляемой средой CRT.The static library provides a proxy between your managed code and the native CRT. Невозможно использовать статически скомпонованные CRT (параметры /MT или /MTd ) с параметром /clr.You cannot use the statically linked CRT ( /MT or /MTd options) with /clr. Вместо этого используйте динамически скомпонованные библиотеки (/MD или /MDd).Use the dynamically-linked libraries (/MD or /MDd) instead. Полностью управляемые библиотеки CRT отмечены как нерекомендуемые для использования в Visual Studio 2015 и не поддерживаются в Visual Studio 2017.The pure managed CRT libraries are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017.

Дополнительные сведения об использовании CRT с /clr см. в разделе Смешанные (собственные и управляемые) сборки.For more information on using the CRT with /clr, see Mixed (Native and Managed) Assemblies.

Для сборки отладочной версии приложения должен быть определен флаг _DEBUG, и приложение должно быть скомпоновано с отладочной версией одной из этих библиотек.To build a debug version of your application, the _DEBUG flag must be defined and the application must be linked with a debug version of one of these libraries. Дополнительные сведения об использовании отладочных версий файлов библиотек см. в разделе Методы отладки CRT.For more information about using the debug versions of the library files, see CRT Debugging Techniques.

Эта версия CRT не полностью совместима со стандартом C99.This version of the CRT is not fully conformant with the C99 standard. В частности, заголовок <tgmath.h> и макросы pragma CX_LIMITED_RANGE/FP_CONTRACT не поддерживаются.In particular, the <tgmath.h> header and the CX_LIMITED_RANGE/FP_CONTRACT pragma macros are not supported. Некоторые элементы, такие как значения спецификаторов параметров в стандартных функциях ввода-вывода, по умолчанию используют интерпретации прежних версий.Certain elements such as the meaning of parameter specifiers in standard IO functions use legacy interpretations by default. Для управления некоторыми аспектами соответствия библиотеки можно использовать параметры согласованности компилятора /Zc и задать параметры компоновщика.You can use /Zc compiler conformance options and specify linker options to control some aspects of library conformance,

Стандартная библиотека C++C++ Standard Library

Стандартная библиотека C++C++ Standard Library ХарактеристикиCharacteristics ПараметрOption Директивы препроцессораPreprocessor directives
libcpmt.liblibcpmt.lib Многопоточная, статическая компоновка.Multithreaded, static link /MT/MT _MT_MT
msvcprt.libmsvcprt.lib Многопоточная динамическая компоновка (библиотека импорта для MSVCPверсия.dll)Multithreaded, dynamic link (import library for MSVCPversion.dll) /MD/MD _MT, _DLL_MT, _DLL
libcpmtd.liblibcpmtd.lib Многопоточная, статическая компоновка.Multithreaded, static link /MTd/MTd _DEBUG, _MT_DEBUG, _MT
msvcprtd.libmsvcprtd.lib Многопоточная динамическая компоновка (библиотека импорта для MSVCPверсияD.DLL)Multithreaded, dynamic link (import library for MSVCPversionD.DLL) /MDd/MDd _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL

При сборке финальной версии проекта одна из базовых библиотек времени выполнения C (libcmt.lib, msvcmrt.lib, msvcrt.lib) будет скомпонована по умолчанию, в зависимости от выбранного параметра компилятора (многопоточный, DLL, /clr).When you build a release version of your project, one of the basic C run-time libraries (libcmt.lib, msvcmrt.lib, msvcrt.lib) is linked by default, depending on the compiler option you choose (multithreaded, DLL, /clr). Если вы включите в код любой из файлов заголовка стандартной библиотеки C++, Visual C++ автоматически подключит стандартную библиотеку C++ во время компиляции.If you include one of the C++ Standard Library header files in your code, a C++ Standard Library will be linked in automatically by Visual C++ at compile time. Например:For example:

#include <ios>

Для совместимости на уровне двоичного кода одна библиотека импорта может задавать несколько DLL-файлов.For binary compatibility, more than one DLL file may be specified by a single import library. Обновления версий могут ввести библиотеки dot — отдельные DLL-файлы, которые вводят новые функции библиотеки.Version updates may introduce dot libraries, separate DLLs that introduce new library functionality. Например, в Visual Studio 2017 версии 15.6 появился файл msvcp140_1.dll для поддержки дополнительных функций стандартной библиотеки без нарушения ABI, поддерживаемого msvcp140.dll.For example, Visual Studio 2017 version 15.6 introduced msvcp140_1.dll to support additional standard library functionality without breaking the ABI supported by msvcp140.dll. Библиотека импорта msvcprt.lib, включенная в набор инструментов для Visual Studio 2017 версии 15.6, поддерживает оба DLL-файла, а vcredist для этой версии устанавливает оба DLL-файла.The msvcprt.lib import library included in the toolset for Visual Studio 2017 version 15.6 supports both DLLs, and the vcredist for this version installs both DLLs. После доставки библиотека dot имеет фиксированный ABI и никогда не будет зависеть от библиотеки dot более поздней версии.Once shipped, a dot library has a fixed ABI, and will never have a dependency on a later dot library.

Если приложение использует несколько версий CRT, с какими проблемами можно столкнуться?What problems exist if an application uses more than one CRT version?

С каждым исполняемым образом (EXE или DLL) может статически связываться собственная библиотека CRT. В образе может создаваться динамическая ссылка на CRT.Every executable image (EXE or DLL) can have its own statically linked CRT, or can dynamically link to a CRT. Версия CRT статически включена или динамически загружается в зависимости от версии средств и библиотек, в которой она был создана.The version of the CRT statically included in or dynamically loaded by a particular image depends on the version of the tools and libraries it was built with. В рамках одного процесса может загружаться несколько образов EXE и DLL, каждый с собственной библиотекой CRT.A single process may load multiple EXE and DLL images, each with its own CRT. Распределители, внутренние структуры макета и варианты организации хранилища для этих CRT могут быть разными.Each of those CRTs may use a different allocator, may have different internal structure layouts, and may use different storage arrangements. Это означает, что выделенная память, ресурсы CRT или классы, которые передаются через границу библиотеки DLL, могут вызвать проблемы с управлением памятью, внутренним статическим использованием или интерпретацией макета.This means that allocated memory, CRT resources, or classes passed across a DLL boundary can cause problems in memory management, internal static usage, or layout interpretation. Например, если класс выделен в одной библиотеке DLL, но передан в другую и удален, какой используется метод освобождения CRT?For example, if a class is allocated in one DLL but passed to and deleted by another, which CRT deallocator is used? Возникающие ошибки могут быть в диапазоне от несущественных до неустранимых. Поэтому настоятельно не рекомендуем передавать такие ресурсы напрямую.The errors caused can range from the subtle to the immediately fatal, and therefore direct transfer of such resources is strongly discouraged.

Многих проблем можно избежать, воспользовавшись технологией двоичного интерфейса приложений (ABI). Она ориентирована на стабильность и поддержку версий.You can avoid many of these issues by using Application Binary Interface (ABI) technologies instead, as they are designed to be stable and versionable. Разрабатывайте ваши интерфейсы экспорта DLL для передачи информации в виде значения или для работы в памяти, которая передается вызывающим объектом, а не в локально выделенной памяти, которая возвращается вызывающей стороне.Design your DLL export interfaces to pass information by value, or to work on memory that is passed in by the caller rather than allocated locally and returned to the caller. Используйте методы маршалинга для копирования структурированных данных между исполняемыми образами.Use marshalling techniques to copy structured data between executable images. Инкапсулируйте ресурсы локально и допускайте действия только через дескрипторы или функции, которые вы предоставляете клиентам.Encapsulate resources locally and only allow manipulation through handles or functions you expose to clients.

Кроме того, вы можете избежать некоторых из этих проблем, если для всех образов в процессе будет использоваться одна и та же версия динамически загружаемой библиотеки CRT.It's also possible to avoid some of these issues if all of the images in your process use the same dynamically loaded version of the CRT. Чтобы использовать для всех компонентов одну и ту же версию DLL библиотеки CRT, создайте их с помощью параметра /MD и примените одни и те же настройки параметров и набор инструментов компилятора.To ensure that all components use the same DLL version of the CRT, build them by using the /MD option, and use the same compiler toolset and property settings.

Необходимо соблюдать осторожность, если ваша программа передает некоторые объекты CRT (например, дескрипторы файлов, языковые стандарты и переменные среды) через границы библиотеки DLL даже при использовании одной и той же версии CRT.Some care is needed if your program passes certain CRT resources (such as file handles, locales and environment variables) across DLL boundaries, even when using the same version of the CRT. Дополнительные сведения о связанных проблемах и способах их устранения см. в разделе Потенциальные ошибки при передаче объектов CRT через границы DLL.For more information on the issues involved and how to resolve them, see Potential Errors Passing CRT Objects Across DLL Boundaries.

См. такжеSee also