Где посмотреть реализацию стандартной библиотеки?
Для углубления в программирование решил заняться изучением/переписыванием stl. Подскажите где я могу посмотреть ее реализацию? Описание в хедерах — не плохо, но этого недостаточно.
Отслеживать
23.8k 3 3 золотых знака 47 47 серебряных знаков 61 61 бронзовый знак
задан 10 апр 2019 в 20:11
3 2 2 бронзовых знака
Ну вообще-то и большая часть реализации тоже в хедерах. Место нахождения реализации следует определять для конкретных вариантов бибилиотек. Если речь идет о VS, то исходники библиотеки лежат в папке
10 апр 2019 в 20:14
А чего это вдруг недостаточно? STL — это библиотека шаблонов (название как бы намекает), она в заголовочных файлах и находится.
10 апр 2019 в 20:15
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вероятно, речь идёт не об оригинальной STL, написанной Александром Степановым, а о стандартной библиотеке C++. У неё реализаций много: почти каждый компилятор имеет свою, и не у всех открыты исходники. Однако, есть открытые. Например, GCC использует libstdc++, исходники которой доступны для просмотра онлайн здесь (это зеркало для git://gcc.gnu.org/git/gcc.git). У clang (LLVM) есть libc++, исходники которой доступны здесь.
Отслеживать
ответ дан 10 апр 2019 в 20:17
243 2 2 серебряных знака 8 8 бронзовых знаков
Да, я действительно имел ввиду стандартные библиотеки c/c++. Спасибо.
10 апр 2019 в 20:20
@Morphey дружеский совет: не пытайтесь смотреть реализацию libstdc++, сразу смотрите libc++, сбережёте время и нервы.
Форум русскоязычного сообщества Ubuntu
Страница сгенерирована за 0.038 секунд. Запросов: 25.
- Сайт
- Об Ubuntu
- Скачать Ubuntu
- Семейство Ubuntu
- Новости
- Форум
- Помощь
- Правила
- Документация
- Пользовательская документация
- Официальная документация
- Семейство Ubuntu
- Материалы для загрузки
- Совместимость с оборудованием
- RSS лента
- Сообщество
- Наши проекты
- Местные сообщества
- Перевод Ubuntu
- Тестирование
- RSS лента
© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.
Файлы стандартной библиотеки 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 | 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.dll | DLL-библиотека импорта для vcruntime. | /MD | _MT , _DLL |
| vcruntimed.lib | vcruntimed.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 заголовок не поддерживается. Во всех версиях макросы CX_LIMITED_RANGE и FP_CONTRACT pragma не поддерживаются. Некоторые элементы, такие как значения спецификаторов параметров в стандартных функциях ввода-вывода, по умолчанию используют интерпретации прежних версий. Вы можете использовать /Zc параметры соответствия компилятора и указать параметры компоновщика для управления некоторыми аспектами соответствия библиотеки.
Файлы стандартной библиотеки C++ (STL) .lib
| Стандартная библиотека C++ | Характеристики | Параметр | Директивы препроцессора |
|---|---|---|---|
| libcpmt.lib | Многопоточная, статическая компоновка. | /MT | _MT |
| msvcprt.lib | Многопоточный динамический канал (библиотека импорта для msvcp.dll ) | /MD | _MT , _DLL |
| libcpmtd.lib | Многопоточная, статическая компоновка. | /MTd | _DEBUG , _MT |
| msvcprtd.lib | Многопоточный динамический канал (библиотека импорта для msvcpd.dll ) | /MDd | _DEBUG , _MT , _DLL |
При сборке версии выпуска проекта одна из базовых библиотек среды выполнения C ( libcmt.lib , , msvcmrt.lib ) msvcrt.lib связана по умолчанию в зависимости от выбранного параметра компилятора (многопоточный, DLL, /clr ). Если в код включен один из файлов заголовков стандартной библиотеки C++, стандартная библиотека C++ будет автоматически связана visual C++ во время компиляции. Например:
#include
Для совместимости на уровне двоичного кода одна библиотека импорта может задавать несколько 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.
Где найти стандартные библиотеки Си?
Перешёл с VS на VS Code, и решил создать Hello world для теста. Компилятор gcc настроен. Возникает ошибка, что нету файла stdio.
Как я понял, нету стандартных библиотек Си. Где их взять? Я слышал, на линуксе это всё решается установкой libc6, но что делать на Windows?
- Вопрос задан более трёх лет назад
- 302 просмотра
3 комментария
Простой 3 комментария
С gcc все должно идти в комплекте. Откуда gcc взяли, как настраивали?

Уточните, как вы настраивали. Я попробовал только что настроить через wls2 и всё работает.
Может сам vs code не настроен для работы с компилятором?
Решения вопроса 0
Ответы на вопрос 1
Очевидно компилятор не знает где находятся эти файлы, это прописывают либо в переменных окружения (INCLUDE или LIB через ‘;’ если путей много) или в настройках проекта (в файлах управления сборкой, например makefile)
Все зависит от того что за компилятор вы выбрали, mingw, cygwin, llvm clang или средства сборки microsoft visual studio?
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Android
- +3 ещё
Какие есть доки по сборке APK/AAB с использованием Android NDK?
- 1 подписчик
- 30 дек. 2023
- 65 просмотров