Что такое библиотека времени выполнения C? - PullRequest
141 голосов
/ 04 мая 2010

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

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

Ответы [ 8 ]

61 голосов
/ 04 мая 2010

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

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

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

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

50 голосов
/ 21 декабря 2012

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

см .: http://en.wikipedia.org/wiki/Runtime_library

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

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

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

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

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

16 голосов
/ 21 февраля 2017

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

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

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

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

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

Вывод: RUNTIMELibrary - ошибка именования. Возможно, в ранние времена не было .dll (связывание во время выполнения), и проблемы понимания разницы просто не существовало. Но даже если это правда, имя выбрано неудачно.

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

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

14 голосов
/ 04 мая 2010

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

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

9 голосов
/ 29 мая 2014

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

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

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

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

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

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

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

6 голосов
/ 04 мая 2010

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

4 голосов
/ 04 мая 2010

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

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

1 голос
/ 04 мая 2010

В комплект поставки 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...