Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib

В этой статье перечислены файлы библиотеки .lib среды выполнения Microsoft C, с которыми можно связаться при разработке приложения, а также связанные с ними параметры компилятора и директивы препроцессора.

Сведения о развертывании файлов среды выполнения C, необходимых для поддержки приложения, см. в статье Распространение файлов Visual C++ .

Если вам нужен справочник по API для библиотеки среды выполнения C, см. статью Справочник по библиотеке среды выполнения C.

Примечание

Реализацию стандартной библиотеки C++ майкрософт часто называют STL или стандартной библиотекой шаблонов. Хотя стандартная библиотека C++ — это официальное название библиотеки, определенное в СТАНДАРТЕ ISO 14882, из-за популярного использования "STL" и "Стандартной библиотеки шаблонов" в поисковых системах, мы иногда используем эти имена, чтобы упростить поиск документации.

С исторической точки зрения , "STL" первоначально относится к стандартной библиотеке шаблонов, написанной Александром Степановым. Части этой библиотеки были стандартизированы в стандартной библиотеке C++. Стандартная библиотека также включает библиотеку времени выполнения ISO C, части библиотеки Boost и другие функции. Иногда "STL" используется для обозначения контейнеров и алгоритмов стандартной библиотеки C++, адаптированной из STL Степанова. В этой документации стандартная библиотека шаблонов (STL) относится к стандартной библиотеке C++ в целом.

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

Стандартная библиотека ISO C является частью стандартной библиотеки C++. Библиотеки Visual C++, которые реализуют CRT, поддерживают разработку с использованием машинного кода, а также сочетания машинного и управляемого кода. Все версии библиотек CRT поддерживают разработку многопоточного кода. Большинство библиотек поддерживает как статическое связывание (для связывания библиотеки непосредственно в коде), так и динамическое связывание (для использования в коде общих библиотек DLL).

В Visual Studio 2015 CRT был преобразован в новые двоичные файлы. Универсальная библиотека CRT (UCRT) содержит функции и глобальные переменные, экспортируемые стандартной библиотекой CRT C99. UCRT теперь является компонентом Windows и поставляется в составе Windows 10 и более поздних версий. Статическая библиотека, библиотека импорта DLL и файлы заголовков для UCRT теперь находятся в windows SDK. При установке Visual C++ программа установки Visual Studio устанавливает подмножество windows SDK, необходимое для использования UCRT. Библиотеку UCRT можно использовать в любой версии Windows, поддерживаемой Visual Studio 2015 и более поздними версиями. Вы можете повторно распространить его с помощью vcredist для поддерживаемых версий Windows, отличных от Windows 10 или более поздних версий. Дополнительные сведения см. в разделе Распространение файлов Visual C++.

В следующей таблице перечислены библиотеки, которые реализуют UCRT.

Библиотека Связанная DLL Характеристики Параметр Директивы препроцессора
libucrt.lib Нет Статически связывает UCRT в коде. /MT _MT
libucrtd.lib Нет Отладочная версия UCRT для статического связывания. Нераспространяемый компонент. /MTd _DEBUG, _MT
ucrt.lib ucrtbase.dll DLL-библиотека импорта для UCRT. /MD _MT, _DLL
ucrtd.lib ucrtbased.dll DLL-библиотека импорта для отладочной версии UCRT. Нераспространяемый компонент. /MDd _DEBUG, _MT, _DLL

Библиотека vcruntime содержит код, зависящий от реализации Visual C++ CRT: поддержку обработки исключений и отладки, сведения о проверках и типах среды выполнения, сведения о реализации и некоторые расширенные функции библиотеки. Версия библиотеки vcruntime должна соответствовать версии используемого компилятора.

В этой таблице перечислены библиотеки, которые реализуют библиотеку vcruntime.

Библиотека Связанная DLL Характеристики Параметр Директивы препроцессора
libvcruntime.lib Нет Статически связанная с кодом. /MT _MT
libvcruntimed.lib Нет Отладочная версия для статического связывания. Нераспространяемый компонент. /MTd _MT, _DEBUG
vcruntime.lib vcruntime<version>.dll DLL-библиотека импорта для vcruntime. /MD _MT, _DLL
vcruntimed.lib vcruntime<version>d.dll DLL-библиотека импорта для отладочной версии vcruntime. Нераспространяемый компонент. /MDd _DEBUG, _MT, _DLL

Примечание

При рефакторинге UCRT функции среды выполнения с параллелизмом были перемещены в concrt140.dll, который был добавлен в распространяемый пакет C++. Эта библиотека DLL необходима для параллельных контейнеров и алгоритмов C++, таких как concurrency::parallel_for. Кроме того, стандартная библиотека C++ требует, чтобы эта библиотека DLL в Windows XP поддерживала примитивы синхронизации, так как в Windows XP нет переменных условий.

Код, инициализирующий CRT, находится в одной из нескольких библиотек в зависимости от статического или динамического связывания библиотеки CRT и использования машинного, управляемого или смешанного кода. Этот код обрабатывает запуск, инициализацию внутренних данных потоков и завершение CRT. Это зависит от используемой версии компилятора. Эта библиотека всегда статически связана, даже при использовании динамически связанной библиотеки UCRT.

В этой таблице перечислены библиотеки, которые реализуют инициализацию и завершение CRT.

Библиотека Характеристики Параметр Директивы препроцессора
libcmt.lib Статически связывает в коде запуск CRT машинного кода. /MT _MT
libcmtd.lib Статически связывает отладочную версию запуска CRT в машинном коде. Нераспространяемый компонент. /MTd _DEBUG, _MT
msvcrt.lib Статическая библиотека для запуска CRT в машинном коде для использования с DLL, UCRT и vcruntime. /MD _MT, _DLL
msvcrtd.lib Статическая библиотека для запуска отладочной версии CRT в машинном коде для использования с DLL, UCRT и vcruntime. Нераспространяемый компонент. /MDd _DEBUG, _MT, _DLL
msvcmrt.lib Статическая библиотека для запуска CRT в смешанном машинном и управляемом коде для использования с DLL, UCRT и vcruntime. /clr
msvcmrtd.lib Статическая библиотека для запуска отладочной версии CRT в смешанном машинном и управляемом коде для использования с DLL, UCRT и vcruntime. Нераспространяемый компонент. /clr
msvcurt.lib Нерекомендуемая статическая библиотека для CRT с полностью управляемым кодом. /clr:pure
msvcurtd.lib Нерекомендуемая статическая библиотека для отладочной версии CRT с полностью управляемым кодом. Нераспространяемый компонент. /clr:pure

При связывании программы из командной строки без параметра компилятора, указывающего библиотеку среды выполнения C, компоновщик будет использовать статически связанные библиотеки CRT: libcmt.lib, libvcruntime.libи libucrt.lib.

Использование статически скомпонованных CRT означает, что все сведения о состоянии, сохраненные библиотекой времени выполнения C, будут локальны по отношению к этому экземпляру CRT. Например, при использовании strtok статически связанной strtok CRT позиция средства синтаксического анализа не связана с strtok состоянием, используемым в коде в том же процессе (но в другой библиотеке DLL или EXE), связанном с другим экземпляром статической CRT. Напротив, динамически скомпонованная библиотека CRT позволяет использовать состояние всему коду в процессе, который динамически скомпонован с этой библиотекой CRT. Эта проблема не применяется при использовании новых более безопасных версий этих функций. например, strtok_s не имеет этой проблемы.

Так как библиотека DLL, созданная путем связывания со статическим CRT, имеет собственное состояние CRT, мы не рекомендуем связывать статически с CRT в библиотеке DLL, если только последствия не понятны и не нужны. Например, при вызове _set_se_translator в исполняемом файле, который загружает библиотеку DLL, связанную с собственной статической CRT, все аппаратные исключения, созданные кодом в библиотеке DLL, не будут перехвачены переводчиком, но аппаратные исключения, созданные кодом в основном исполняемом файле, будут перехвачены.

Если вы используете параметр компилятора/clr, код будет связан со статической библиотекой . msvcmrt.lib Эта статическая библиотека предоставляет функцию прокси между управляемым кодом и неуправляемой средой CRT. Нельзя использовать статически связанную CRT ( /MT или /MTd параметры) с /clr. Вместо этого используйте динамически связанные библиотеки (/MD или /MDd). Полностью управляемые библиотеки CRT отмечены как нерекомендуемые для использования в Visual Studio 2015 и не поддерживаются в Visual Studio 2017.

Дополнительные сведения об использовании CRT с /clrсм. в разделе Смешанные (собственные и управляемые) сборки.

Чтобы создать отладочную версию приложения, _DEBUG необходимо определить флаг и связать приложение с отладочной версией одной из этих библиотек. Дополнительные сведения об использовании отладочных версий файлов библиотеки см. в разделе Методы отладки CRT.

Эта версия CRT не полностью соответствует стандарту C99. В версиях до Visual Studio 2019 версии 16.8 <tgmath.h> заголовок не поддерживается. Во всех версиях CX_LIMITED_RANGE макросы и FP_CONTRACT pragma не поддерживаются. Некоторые элементы, такие как значения спецификаторов параметров в стандартных функциях ввода-вывода, по умолчанию используют интерпретации прежних версий. Вы можете использовать /Zc параметры соответствия компилятора и указать параметры компоновщика для управления некоторыми аспектами соответствия библиотек.

Файлы стандартной библиотеки C++ (STL) .lib

Стандартная библиотека C++ Характеристики Параметр Директивы препроцессора
libcpmt.lib Многопоточная, статическая компоновка. /MT _MT
msvcprt.lib Многопоточность, динамическая ссылка (импорт библиотеки для msvcp<version>.dll) /MD _MT, _DLL
libcpmtd.lib Многопоточная, статическая компоновка. /MTd _DEBUG, _MT
msvcprtd.lib Многопоточность, динамическая ссылка (импорт библиотеки для msvcp<version>d.dll) /MDd _DEBUG, _MT, _DLL

При сборке версии выпуска проекта одна из базовых библиотек среды выполнения C (libcmt.lib, msvcmrt.lib, msvcrt.lib) связана по умолчанию в зависимости от выбранного параметра компилятора (многопоточный, DLL, /clr). Если включить в код один из файлов заголовков стандартной библиотеки C++ , стандартная библиотека C++ будет автоматически связана с помощью Visual C++ во время компиляции. Например:

#include <ios>

Для совместимости на уровне двоичного кода одна библиотека импорта может задавать несколько DLL-файлов. Обновления версий могут ввести библиотеки dot — отдельные DLL-файлы, которые вводят новые функции библиотеки. Например, в Visual Studio 2017 версии 15.6 реализована msvcp140_1.dll поддержка более стандартных функций библиотек без нарушения двоичного интерфейса приложения (ABI), поддерживаемого msvcp140.dll. Библиотека импорта, включенная msvcprt.lib в набор инструментов для Visual Studio 2017 версии 15.6, поддерживает обе библиотеки DLL, а vcredist для этой версии устанавливает обе библиотеки DLL. После доставки библиотека dot имеет фиксированный ABI и никогда не будет зависеть от библиотеки dot более поздней версии.

Если приложение использует несколько версий CRT, с какими проблемами можно столкнуться?

С каждым исполняемым образом (EXE или DLL) может статически связываться собственная библиотека CRT. В образе может создаваться динамическая ссылка на CRT. Версия CRT статически включена или динамически загружается в зависимости от версии средств и библиотек, в которой она был создана. В рамках одного процесса может загружаться несколько образов EXE и DLL, каждый с собственной библиотекой CRT. Распределители, внутренние структуры макета и варианты организации хранилища для этих CRT могут быть разными. Это означает, что выделенная память, ресурсы CRT или классы, передаваемые через границу библиотеки DLL, могут вызвать проблемы с управлением памятью, внутренним статическим использованием или интерпретацией макета. Например, если класс выделен в одной библиотеке DLL, но передан в другую и удален, какой используется метод освобождения CRT? Вызванные ошибки могут варьироваться от незначительных до немедленного неустранимого, поэтому не рекомендуется прямая передача таких ресурсов.

Многие из этих проблем можно избежать, используя технологии двоичного интерфейса приложения (ABI), так как они предназначены для обеспечения стабильной и версиообразуемой версии. Разрабатывайте ваши интерфейсы экспорта DLL для передачи информации в виде значения или для работы в памяти, которая передается вызывающим объектом, а не в локально выделенной памяти, которая возвращается вызывающей стороне. Используйте методы маршалинга для копирования структурированных данных между исполняемыми образами. Инкапсулируйте ресурсы локально и допускайте действия только через дескрипторы или функции, которые вы предоставляете клиентам.

Кроме того, вы можете избежать некоторых из этих проблем, если для всех образов в процессе будет использоваться одна и та же версия динамически загружаемой библиотеки CRT. Чтобы убедиться, что все компоненты используют одну и ту же версию библиотеки DLL CRT, выполните сборку /MD с помощью параметра и используйте один набор инструментов компилятора и параметры свойств.

Будьте внимательны, если программа передает определенные ресурсы CRT через границы DLL. Ресурсы, такие как дескрипторы файлов, языковые стандарты и переменные среды, могут вызвать проблемы даже при использовании одной и той же версии CRT. Дополнительные сведения о проблемах и способах их устранения см. в статье Потенциальные ошибки при передаче объектов CRT через границы DLL.

См. также раздел

Справочник по библиотеке времени выполнения C
Распространение файлов Visual C++