Файлы стандартной библиотеки 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.lib
libucrt.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++