2010-05-04 4 views
123

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

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

ответ

58

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

Таким образом, в названии «libcmt», «Libc» I (более или менее) традиционное имя для библиотеки C. «Mt» означает «многопоточность». Версия «debug» добавила бы «d» в конец, давая «libcmtd».

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

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

+18

Вы не сказали, что такое «C runtime library»! – onmyway133

+2

@entropy: Конечно, выглядит так, как я, но короткий ответ заключается в том, что это набор функций, многие из которых (но не обязательно все) указаны в части 7 стандарта C. –

+0

Этот ответ подразумевает, что библиотеки C являются частью программных цепочек компилятора. Не точный. – jiggunjer

2

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

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

1

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

* 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. 

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

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

12

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

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

+6

На самом деле, стандарты C описывают два типа сред C - «автономные» и «размещенные» - и в размещенных средах функции, описанные в стандартах *, определены как доступные. Во встроенных системах среда C обычно является автономной, поэтому у вас могут не быть библиотечных подпрограмм, или вы можете избежать использования некоторых и использовать свои собственные замены. – 2015-09-21 04:40:34

4

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

+3

Только если при компиляции этого исполняемого файла среда выполнения C была связана динамически. Если он был связан статически, ходячий ходячий покажет nothiing. –

37

Во-первых, мы должны понять, что библиотека времени выполнения является, и думаю, что это может означать, по «Microsoft C Runtime Library»

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

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

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

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

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

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

+2

Выделенное предложение как способ, отличающийся от стандартной библиотеки, является первым кратким точным ответом, который я видел не с «большинством» или «иногда». –

7

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

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

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

  • таНосу
  • перечисления , struct
  • abs, min
  • assert

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

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

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

+0

Является ли структура и enum реальной библиотекой времени выполнения? –

6

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

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

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

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

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

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

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

надежды я получил это право, вверх для коррекции/расширения приветствий.

+0

Я до сих пор не понимаю идею. Почему в Runtime требуется что-то в программе? Почему двоичный код не может работать, 100% один, без поддержки его во время выполнения? Или другими словами: возможно ли иметь код, который работает на 100% без чего-либо (включая ОС)? – MarcioAB

Смежные вопросы