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

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

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

Ознакомьтесь со ссылкой на библиотеку среды выполнения C, если вы ищете справочник по API для библиотеки среды выполнения C.

Примечание.

Реализация стандартной библиотеки C++ майкрософт часто называется библиотекой шаблонов STL или Standard. Хотя стандартная библиотека 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 теперь находятся в пакете SDK для Windows. При установке Visual C++программа установки Visual Studio устанавливает подмножество пакета SDK для Windows, необходимое для использования 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.liblibucrt.lib.

Использование статически скомпонованных CRT означает, что все сведения о состоянии, сохраненные библиотекой времени выполнения C, будут локальны по отношению к этому экземпляру CRT. Например, если вы используете strtok статически связанный CRT, позиция strtok средства синтаксического анализа не связана с 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++