Где находятся библиотеки c
Перейти к содержимому

Где находятся библиотеки c

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

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

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

См. раздел Справочник по библиотеке времени выполнения c , если вы ищете Справочник по API для библиотеки времени выполнения c.

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

Библиотека времени выполнения C (CRT) является частью стандартной библиотеки C++, которая включает стандартную библиотеку ISO 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 None Статически связывает UCRT в коде. /MT _MT
libucrtd.lib None Отладочная версия 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 None Статически связанная с кодом. /MT _MT
libvcruntimed.lib None Отладочная версия для статического связывания. Нераспространяемый компонент. /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 . в разделе /clr .

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

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

Файлы стандартной библиотеки C++ .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++ во время компиляции. Пример:

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

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

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

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

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

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

Есть ли каталог библиотек C?

Я сейчас стал применять знания по СИ, активно пишу программу и у меня есть небольшая неясность, которую вы, надеюсь, поможете мне преодолеть. При написании консольного приложения я понял, что стандартных библиотек мне из Кернигана и Ритчи, ну никак не хватает. Я стал разбираться, что мне нужно и выяснил, что мне для написания требуется очень много сторонних библиотек, типа:

Но это очень маленькая часть того, что мне нужно. Но меня в C убило и разозлило, что нет единого официального каталога с документацией по библиотекам( кроме http://www.cplusplus.com/reference/clibrary/). Это очень сильно напомнило мне язык Javascript — он ущербный и мало функциональный, но когда полностью осваиваешь стороннюю библиотеку (я освоил фреймворк jQuery + jQuery UI), то просто обалдел от его возможностей.

Подскажите, есть ли подобное в языке C или там всегда был, и есть хаос с библиотеками и документацией к ней?

Подключение и использование библиотек в Visual Studio

В качестве примера мы рассмотрим подключение библиотеки SDL к нашему проекту в Visual Studio 2017 (работать будет и с более новыми версиями Visual Studio).

Шаг №1: Создаем папку для хранения библиотеки

Создаем папку Libs на диске C ( C:\Libs ).

Шаг №2: Скачиваем и устанавливаем библиотеку

Заходим на сайт https://www.libsdl.org/download-2.0.php, пролистываем вниз до «Development Libraries» и скачиваем SDL2-devel-2.0.9-VC.zip (Visual C++ 32/64-bit). После успешного скачивания нужно разархивировать этот архив в папку Libs .

Шаг №3: Указываем путь к заголовочным файлам библиотеки

Открываем свой любой проект в Visual Studio или создаем новый, переходим в «Обозреватель решений» > кликаем правой кнопкой мыши (ПКМ) по названию нашего проекта > «Свойства» :

В «Свойства конфигурации» ищем вкладку «С/С++» > «Общие» . Затем выбираем пункт «Дополнительные каталоги включаемых файлов» > нажимаем на стрелочку в конце > «Изменить» :

В появившемся окне кликаем на иконку с изображением папки, а затем на появившееся троеточие:

Заголовочные файлы находятся в папке include внутри нашей библиотеки, поэтому переходим в нее ( C:\Libs\SDL2-2.0.9\include ) и нажимаем «Выбор папки» , а затем «ОК» :

Шаг №4: Указываем путь к файлам с реализацией библиотеки

Переходим на вкладку «Компоновщик» > «Общие» . Ищем пункт «Дополнительные каталоги библиотек» > нажимаем на стрелочку в конце > «Изменить» :

Опять же, нажимаем на иконку с папкой, а затем на появившееся троеточие. Нам нужно указать следующий путь: C:\Libs\SDL2-2.0.9\lib\x86 . Будьте внимательны, в папке lib находятся две папки: x64 и x86 . Даже если у вас Windows разрядности x64, указывать нужно папку x86 . Затем «Выбор папки» и «ОК» :

После этого переходим в «Компоновщик» > «Ввод» . Затем «Дополнительные зависимости» > нажимаем на стрелочку в конце > «Изменить» :

В появившемся текстовом блоке вставляем:

Затем переходим в «Компоновщик» > «Система» . После этого «Подсистема» > нажимаем на стрелочку вниз > выбираем «Консоль (/SUBSYSTEM:CONSOLE)» > «Применить» > «ОК» :

Шаг №5: Копируем dll-ку в папку с проектом

Переходим в папку x86 ( C:\Libs\SDL2-2.0.9\lib\x86 ), копируем SDL2.dll и вставляем в папку с вашим проектом в Visual Studio. Чтобы просмотреть папку вашего проекта в Visual Studio, нажмите ПКМ по названию вашего проекта > «Открыть содержащую папку» :

Затем вставляем скопированный файл (SDL2.dll) в папку с проектом (где находится рабочий файл .cpp):

Шаг №6: Тестируем

Теперь, чтобы проверить, всё ли верно мы сделали — копируем и запускаем следующий код:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *