Файлы среды выполнения C (CRT) и библиотеки стандартных библиотек C++ (STL) .libC runtime (CRT) and C++ Standard Library (STL) .lib files

В этом разделе перечислены файлы библиотеки времени выполнения Microsoft C .lib , которые можно связать при разработке приложения, а также связанные с ними параметры компилятора и директивы препроцессора.This topic lists the Microsoft C runtime library .lib files that you can link against when you develop your application, and their associated compiler options and preprocessor directives.

Сведения о развертывании файлов среды выполнения C, необходимых для поддержки приложения, см. в разделе распространение файлов Visual C++ .See Redistributing Visual C++ files if you're looking for information about deploying the C runtime files necessary to support your application.

См. раздел Справочник по библиотеке времени выполнения c , если вы ищете Справочник по API для библиотеки времени выполнения c.See C runtime library reference if you're looking for API reference for the C runtime library.

Файлы среды выполнения C .libC runtime .lib files

Библиотека времени выполнения C (CRT) является частью стандартной библиотеки C++, которая включает стандартную библиотеку ISO C.The C runtime Library (CRT) is the part of the C++ Standard Library that incorporates the ISO C 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. Дополнительные сведения см. в разделе Распространение файлов Visual C++.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.lib НетNone Статически связывает UCRT в коде.Statically links the UCRT into your code. /MT _MT
libucrtd.lib НетNone Отладочная версия UCRT для статического связывания.Debug version of the UCRT for static linking. Нераспространяемый компонент.Not redistributable. /MTd _DEBUG, _MT_DEBUG, _MT
ucrt.lib ucrtbase.dll DLL-библиотека импорта для UCRT.DLL import library for the UCRT. /MD _MT, _DLL_MT, _DLL
ucrtd.lib ucrtbased.dll DLL-библиотека импорта для отладочной версии UCRT.DLL import library for the Debug version of the UCRT. Нераспространяемый компонент.Not redistributable. /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. Версия библиотеки vcruntime должна совпадать с версией компилятора, который вы используете.The vcruntime library version needs to match the version of the compiler you're using.

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

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

Примечание

При рефакторинге UCRT функции среда выполнения с параллелизмом были перемещены в concrt140.dll , которые были добавлены в распространяемый пакет C++.When the UCRT was refactored, 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 doesn't 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's 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.lib Статически связывает в коде запуск CRT машинного кода.Statically links the native CRT startup into your code. /MT _MT
libcmtd.lib Статически связывает отладочную версию запуска CRT в машинном коде.Statically links the Debug version of the native CRT startup. Нераспространяемый компонент.Not redistributable. /MTd _DEBUG, _MT_DEBUG, _MT
msvcrt.lib Статическая библиотека для запуска CRT в машинном коде для использования с DLL, UCRT и vcruntime.Static library for the native CRT startup for use with DLL UCRT and vcruntime. /MD _MT, _DLL_MT, _DLL
msvcrtd.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 _DEBUG, _MT, _DLL_DEBUG, _MT, _DLL
msvcmrt.lib Статическая библиотека для запуска CRT в смешанном машинном и управляемом коде для использования с DLL, UCRT и vcruntime.Static library for the mixed native and managed CRT startup for use with DLL UCRT and vcruntime. /clr
msvcmrtd.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
msvcurt.lib Нерекомендуемая статическая библиотека для CRT с полностью управляемым кодом.Deprecated Static library for the pure managed CRT. /clr:pure
msvcurtd.lib Нерекомендуемая статическая библиотека для отладочной версии CRT с полностью управляемым кодом.Deprecated Static library for the Debug version of the pure managed CRT. Нераспространяемый компонент.Not redistributable. /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 runtime 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 при использовании статически связанной CRT, то расположение strtok средства синтаксического анализа не связано с strtok состоянием, используемым в коде в том же процессе (но в другой библиотеке DLL или exe), связанном с другим экземпляром статической библиотеки CRT.For example, if you use strtok 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 doesn't apply if you use the new more secure versions of these functions; for example, strtok_s doesn't have this problem.

Так как библиотека DLL, созданная путем связывания со статической библиотекой CRT, имеет собственное состояние CRT, не рекомендуется ссылаться статически на CRT в библиотеке DLL, если только эти последствия не были специально нужны и понятны.Because a DLL built by linking to a static CRT has its own CRT state, it isn't 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're 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 isn't fully conformant with the C99 standard. В версиях до Visual Studio 2019 версии 16,8 <tgmath.h> заголовок не поддерживается.In versions before Visual Studio 2019 version 16.8, the <tgmath.h> header isn't supported. Во всех версиях CX_LIMITED_RANGE FP_CONTRACT макросы и директивы pragma не поддерживаются.In all versions, the CX_LIMITED_RANGE and FP_CONTRACT pragma macros aren't 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++ .libC++ Standard Library .lib files

Стандартная библиотека C++C++ Standard Library ХарактеристикиCharacteristics ПараметрOption Директивы препроцессораPreprocessor directives
libcpmt.lib Многопоточная, статическая компоновка.Multithreaded, static link /MT _MT
msvcprt.lib Многопоточная, динамическая компоновка (импорт библиотеки для msvcp<version>.dll )Multithreaded, dynamic link (import library for msvcp<version>.dll) /MD _MT, _DLL_MT, _DLL
libcpmtd.lib Многопоточная, статическая компоновка.Multithreaded, static link /MTd _DEBUG, _MT_DEBUG, _MT
msvcprtd.lib Многопоточная, динамическая компоновка (импорт библиотеки для msvcp<version>d.dll )Multithreaded, dynamic link (import library for msvcp<version>d.dll) /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 runtime libraries (libcmt.lib, msvcmrt.lib, msvcrt.lib) is linked by default, depending on the compiler option you choose (multithreaded, DLL, /clr). Если включить в код один из файлов заголовков стандартной библиотеки c++ , стандартная библиотека c++ будет автоматически связываться с Visual C++ во время компиляции.If you include one of the C++ Standard Library header files in your code, a C++ Standard Library will be linked 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 Application Binary Interface (ABI) supported by msvcp140.dll. msvcprt.lib Библиотека импорта, входящая в набор инструментов для Visual Studio 2017 версии 15,6, поддерживает обе библиотеки DLL, а для этой версии устанавливается обе библиотеки 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 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 marshaling 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. Чтобы убедиться, что все компоненты используют одну и ту же версию библиотеки 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.Be careful if your program passes certain CRT resources across DLL boundaries. Такие ресурсы, как дескрипторы файлов, языковые стандарты и переменные среды, могут вызывать проблемы даже при использовании той же версии CRT.Resources such as file handles, locales, and environment variables can cause problems, 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