Что такое библиотека времени выполнения C?

158

Что такое библиотека времени выполнения C и для чего она используется? Я искал, гуглял как дьявол, но не мог найти ничего лучше, чем Microsoft: «Библиотека времени выполнения Microsoft предоставляет подпрограммы для программирования для операционной системы Microsoft Windows. Эти подпрограммы автоматизируют многие распространенные задачи программирования, которые не предоставляются языки C и C ++. "

Хорошо, я понимаю, но, например, что в libcmt.lib? Что оно делает? Я думал, что стандартная библиотека C была частью компилятора C. Так работает ли в libcmt.libWindows реализация стандартных библиотечных функций C для win32?

B.Gen.Jack.O.Neill
источник

Ответы:

71

Да, libcmt является (одной из нескольких) реализаций стандартной библиотеки C, предоставляемой компилятором Microsoft. Они предоставляют «отладочную» и «выпускную» версии трех основных типов библиотек: однопоточные (всегда статически связанные), многопоточные статически связанные и многопоточные динамически связанные (хотя, в зависимости от версии компилятора, который вы используете некоторые из них могут отсутствовать).

Таким образом, в названии "libcmt" "libc" - это (более или менее) традиционное имя для библиотеки C. «Mt» означает «многопоточный». В «отладочную» версию в конце добавили бы «d», давая «libcmtd».

Что касается функций, которые он включает, стандарт C (часть 7, если вам не все равно) определяет набор функций, которые должна обеспечивать соответствующая (размещенная) реализация. Большинство поставщиков (включая Microsoft) сами добавляют различные другие функции (для совместимости, для обеспечения возможностей, которые стандартные функции не обрабатывают, и т. Д.) В большинстве случаев он также будет содержать довольно много «внутренних» функций, которые используются компилятором. но не обычно конечным пользователем.

Если вы хотите получить полный список функций в "libcmt" (используйте ваш пример), вы можете открыть одно из командных приглашений Visual Studio (обычно в разделе "Инструменты Visual Studio"), переключиться в каталог, где находились ваши библиотеки. установить и набрать что-то вроде: lib -list libcmt.libи он сгенерирует ( длинный ) список имен всех объектных файлов в этой библиотеке. Они не всегда соответствуют непосредственно именам функций, но обычно дают представление. Если вы хотите просмотреть конкретный объектный файл, вы можете использовать его lib -extractдля извлечения одного из этих объектных файлов, а затем использовать, dumpbin /symbols <object file name>чтобы найти, какие функции находятся в этом конкретном объектном файле.

Джерри Гроб
источник
37
Вы не сказали, что такое "библиотека времени выполнения C" !!
onmyway133
4
@entropy: Конечно, выглядит так, как я, но краткий ответ - это набор функций, многие (но не обязательно все) из которых указаны в части 7 стандарта C.
Джерри Коффин
3
Этот ответ подразумевает, что библиотеки C являются лишь частью цепочек инструментов компилятора. Не точный.
Jiggunjer
@JerryCoffin Вопрос: будет ли strcpyфункция, например, из стандартной библиотеки C, иметь свою реализацию в библиотеке времени выполнения или она просто будет иметь свой код в обычных файлах .c?
форумчан
@forumulator: обычно в .c-файле будет находиться исходный код, который компилируется для создания стандартной библиотеки (.dll, lib, .a, .so или чего-либо другого, что применяется к используемой системе) ,
Джерри Коффин
57

Сначала мы должны понять, что такое библиотека времени выполнения; и подумайте, что это может означать под «Microsoft C Runtime Library».

видеть: http://en.wikipedia.org/wiki/Runtime_library

Я разместил большую часть статьи здесь, потому что она может быть обновлена.

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

Кроме того, некоторые функции, которые могут выполняться только (или являются более эффективными или точными) во время выполнения, реализованы в библиотеке времени выполнения, например, некоторые логические ошибки, проверка границ массива, динамическая проверка типов, обработка исключений и, возможно, отладка. По этой причине некоторые программные ошибки не обнаруживаются до тех пор, пока программа не протестирована в «живой» среде с реальными данными, несмотря на сложную проверку во время компиляции и предварительное тестирование. В этом случае конечный пользователь может столкнуться с сообщением об ошибке во время выполнения.

Обычно библиотека времени выполнения реализует множество функций, получая доступ к операционной системе. Многие языки программирования имеют встроенные функции, которые не обязательно должны быть реализованы в компиляторе, но могут быть реализованы в библиотеке времени выполнения. Таким образом, граница между библиотекой времени выполнения и стандартной библиотекой зависит от производителя компилятора.Поэтому библиотека времени выполнения всегда зависит от компилятора и платформы.

Понятие библиотеки времени выполнения не следует путать с обычной библиотекой программы, подобной той, которая создается программистом приложения или доставляется третьей стороной, или динамической библиотекой, то есть библиотекой программы, связанной во время выполнения. Например, язык программирования C требует только минимальной библиотеки времени выполнения (обычно называемой crt0), но определяет большую стандартную библиотеку (называемую стандартной библиотекой C), которую должна предоставлять каждая реализация.

fantagons
источник
3
Выделенное предложение как способ отличить стандартную библиотеку является первым кратким точным ответом, который я видел, не квалифицированный как «большинство» или «иногда».
ник.шорников
@ nik.shornikov: Это потому, что другие описания пытаются быть более точными. Хотя это правда, что стандартная библиотека обычно специфична для компилятора и платформы, это не всегда так. Например, по крайней мере некоторые версии Mingw и компилятора Intel C ++ для Windows использовали стандартную библиотеку Microsoft вместо того, чтобы поставлять свои собственные. Аналогично, Clang в Linux может быть (и часто устанавливается) для использования стандартной библиотеки в существующей установке gcc вместо установки другой для себя.
Джерри Гроб
Я вполне уверен, что можно написать реализации стандартных библиотек C и C ++, которые переносимы на любую платформу, поддерживающую POSIX.
Джерри Гроб
21

Я просто спросил об этом сам и несколько часов болел мозг. До сих пор не нашел ничего, что действительно имеет значение. Все, кто что-то пишет в теме, не могут «научить». Если вы хотите научить кого-то, используйте самый простой язык, который понимает человек, поэтому ему не нужно заботиться о других темах при работе с темой. Поэтому я пришел к выводу, что, похоже, хорошо вписывается во весь этот хаос.

На языке программирования C каждая программа начинается с main()функции. Другие языки могут определять другие функции, с которых начинается программа. Но процессор не знает main(). Процессор знает только предопределенные команды, представленные комбинациями 0и 1.

В микропроцессорном программировании, не имеющем базовой операционной системы (Microsoft Windows, Linux, MacOS, ..), вам нужно явно указать процессору, с чего начать, установив ProgramCounter (ПК), который выполняет итерации и скачки (циклы, вызовы функций) в пределах Команды, известные процессору. Вы должны знать, насколько большой объем ОЗУ, вам нужно установить положение стека программы (локальные переменные), а также положение кучи (динамические переменные) и расположение глобальных переменных (я думаю, это называлось SSA). ?) в оперативной памяти. Один процессор может одновременно выполнять только одну программу.

Вот тут и приходит операционная система. Сама операционная система - это программа, которая работает на процессоре. Программа, которая позволяет выполнять пользовательский код. Выполняет несколько программ одновременно, переключаясь между кодами выполнения программ (которые загружаются в ОЗУ). Но операционная система - это программа, каждая программа написана по-своему. Простое помещение кода вашей пользовательской программы в оперативную память не приведет к ее запуску, операционная система не знает этого. Вам необходимо вызвать функции в операционной системе, которая регистрирует вашу программу, сообщить операционной системе, сколько памяти требуется программе, где находится точка входа в программу (main()функция в случае с). И это то, что, как мне кажется, находится в Runtime Library, и объясняет, почему вам нужна специальная библиотека для каждой операционной системы, потому что это всего лишь сами программы и имеют разные функции для выполнения этих задач.

Это также объясняет, почему он НЕ динамически связан во время выполнения с .dllфайлами, даже если он называется библиотекой RUNTIME. Библиотека времени выполнения должна быть связана статически, потому что она необходима при запуске вашей программы. Runtime Library внедряет / подключает вашу пользовательскую программу в / к другой программе (операционной системе) в RUNTIME. Это действительно вызывает некоторый мозг ...

Вывод: RUNTIME Library - сбой в именовании. Возможно, не было .dll(связывание во время выполнения) в ранние времена, и проблема понимания разницы просто не существовала. Но даже если это правда, имя выбрано неправильно.

Лучшими именами для библиотеки времени выполнения могут быть: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

Надеюсь, я понял это правильно, для коррекции / расширения. веселит.

громыхание
источник
1
Я до сих пор не понимаю идеи. Зачем программе нужно что-то во время выполнения? Почему двоичный код не может работать, 100% один, без чего-либо поддерживающего его во время выполнения? Или другими словами: возможно ли иметь код, который работает на 100% без чего-либо (включая ОС)?
MarcioAB,
5
Теоретически программе не нужен RTL. Тем не менее, как ваша программа будет когда-либо отображать свой результат или использовать какой-либо ввод или запрашивать память без какого-либо участия операционной системы?
SN
16

C - это язык, и в его определении не должно быть никаких доступных вам функций. Нет ввода-вывода, нет математических процедур и так далее. По соглашению, вам доступен набор подпрограмм, которые вы можете связать со своим исполняемым файлом, но вам не нужно их использовать. Это, однако, настолько распространенная вещь, что большинство компоновщиков больше не просят вас ссылаться на библиотеки времени выполнения C.

Временами вы их не хотите - например, при работе со встроенными системами может быть нецелесообразно, например, иметь malloc. Раньше я работал над встраиванием PostScript в принтеры, и у нас был собственный набор библиотек времени выполнения, которые были намного счастливее на встраиваемых системах, поэтому мы не беспокоились о «стандарте».

плинтус
источник
11
Фактически, стандарты C описывают два типа сред C - «автономные» и «размещенные» - и в размещенных средах функции, описанные в стандартах , определяются как доступные. Во встроенных системах среда C, как правило, является автономной, поэтому у вас может не быть библиотечных подпрограмм или вы можете избежать их использования и использовать собственные замены.
10

Библиотека времени выполнения - это библиотека, которая автоматически компилируется для любой программы на C, которую вы запускаете. Версия используемой вами библиотеки зависит от вашего компилятора, платформы, параметров отладки и параметров многопоточности.

Хорошее описание различных вариантов для библиотек времени выполнения: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Он включает в себя те функции, которые обычно не нужны для вызова библиотеки:

  • таНос
  • enum, struct
  • абс, мин
  • утверждают

У Microsoft есть хороший список функций библиотеки времени выполнения:

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

Точный список функций зависит от компилятора, поэтому для iOS вы можете получить другие функции, например dispatch_async () или NSLog ().

arinmorf
источник
1
Является ли struct и enum действительно библиотекой времени выполнения?
Дин Р
6

Если вы используете такой инструмент, как Dependency Walker, в исполняемом файле, скомпилированном из C или C ++, вы увидите, что одна из библиотек DLL, от которых она зависит, - это MSVCRT.DLL. Это библиотека времени выполнения Microsoft C. Если вы дополнительно изучите MSVCRT.DLL с DW, вы увидите, что здесь находятся все функции, такие как printf (), put (0, gets (), atoi () и т. Д.).


источник
6
Только если во время компиляции этого исполняемого файла среда выполнения C была динамически связана. Если он был связан статически, то ходок с зависимостями будет ничего не показывать
Эли Бендерский,
4

я думаю, что определение Microsoft действительно означает:

Внедрение Microsoft стандартной библиотеки времени выполнения C обеспечивает ...

Андрей
источник
3

В Win32 SDK есть три формы библиотеки времени выполнения C:

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

32-разрядная версия Microsoft Visual C ++ также содержит эти три формы, однако CRT в DLL называется MSVCRT.LIB. DLL является распространяемой. Его имя зависит от версии VC ++ (то есть MSVCRT10.DLL или MSVCRT20.DLL). Обратите внимание, что MSVCRT10.DLL не поддерживается в Win32s, а CRTDLL.LIB поддерживается в Win32. MSVCRT20.DLL поставляется в двух версиях: одна для Windows NT, а другая для Win32s.

см .: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

Майкл
источник