Що таке бібліотека часу виконання C?


157

Що насправді є бібліотекою часу виконання C і для чого вона використовується? Я шукав, Гуглінг, як чорт, але я не зміг знайти нічого кращого, ніж Microsoft: "Бібліотека часу роботи Microsoft пропонує підпрограми програмування для операційної системи Microsoft Windows. Ці підходи автоматизують багато поширених завдань програмування, які не передбачені мови C і C ++. "

Добре, я це розумію, але, наприклад, що є libcmt.lib? Що це робить? Я подумав, що стандартна бібліотека C входить до складу компілятора C. Тож чи libcmt.libреалізація Windows стандартних функцій бібліотеки С працює під win32?

Відповіді:


71

Так, libcmt - це (одна з декількох) реалізація стандартної бібліотеки С, що надається компілятором Microsoft. Вони забезпечують як "налагодження", так і "випуск" версії трьох основних типів бібліотек: однопотокових (завжди статично пов'язаних), багатопотокових статично пов'язаних і багатопотокових динамічно пов'язаних (хоча, залежно від версії компілятора, яку ви використовуючи, деякі з них можуть бути відсутні).

Отже, у назві "libcmt" "libc" є (більш-менш) традиційною назвою для бібліотеки С. "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 стандарту С.
Джері Коффін

3
З цієї відповіді випливає, що бібліотеки C є лише частиною наборів інструментів компілятора. Не точно.
jiggunjer

Питання @JerryCoffin: як би strcpyфункція зі стандартної бібліотеки С, наприклад, мала її реалізацію в бібліотеці виконання, чи це буде просто код у звичайних файлах .c?
форумчатор

@forumulator: у файлі .c звичайно буде вихідний код, який збирається для створення належної стандартної бібліотеки (..dll, lib, .a, .so, або що завгодно, застосовується до системи, яку ви використовуєте) .
Джеррі Труну

56

Спочатку ми повинні зрозуміти, що таке бібліотека часу виконання; і подумайте, що це може означати під "Бібліотекою Microsoft C Runtime".

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

Більшу частину статті я опублікував тут, оскільки вона може оновлюватися.

Коли вихідний код комп’ютерної програми компілятором переведений на відповідну цільову мову, це призведе до надзвичайного розширення програмного коду, якщо кожна команда в програмі та кожен виклик вбудованої функції спричинять генерацію на місці повного відповідного коду програми на цільовій мові кожного разу. Натомість компілятор часто використовує спеціальні для компілятора допоміжні функції в бібліотеці виконання, які здебільшого недоступні програмістам програм. Залежно від виробника компілятора, бібліотека часу виконання також може містити стандартну бібліотеку відповідного компілятора або міститись у ній.

Також деякі функції, які можуть виконуватися лише (або є більш ефективними або точними) під час виконання, реалізуються в бібліотеці часу виконання, наприклад, деякі логічні помилки, перевірка меж масиву, перевірка динамічного типу, обробка винятків і можливо функція налагодження. З цієї причини деякі помилки програмування не виявляються, поки програма не буде протестована в "живому" середовищі з реальними даними, незважаючи на складну перевірку часу компіляції та тестування перед випуском. У цьому випадку кінцевий користувач може зіткнутися з повідомленням про помилку виконання.

Зазвичай бібліотека виконання реалізує багато функцій шляхом доступу до операційної системи. Багато мов програмування мають вбудовані функції, які не обов'язково повинні бути реалізовані в компіляторі, але можуть бути реалізовані в бібліотеці виконання. Отже, межа між бібліотекою виконання та стандартною бібліотекою залежить від виробника компілятора. Тому бібліотека часу виконання завжди залежить від компілятора та платформи.

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


3
Виділене речення як спосіб, що відрізняє від стандартної бібліотеки, є першою стислою точною відповіддю, яку я бачив, що не кваліфікується з "більшістю" чи "іноді"
nik.shornikov

@ nik.shornikov: Це тому, що інші описи намагаються бути більш точними. Хоча це правда, що стандартна бібліотека, як правило, специфічна для компілятора та платформи, це не завжди так. Наприклад, принаймні деякі версії компілятора Mingw і компілятора Intel C ++ для Windows використовували стандартну бібліотеку Microsoft, а не постачали власну. Крім того, Clang в Linux може бути встановлений (і часто є) встановлений для використання стандартної бібліотеки в існуючій установці gcc, а не для установки іншої для себе.
Джеррі Труну

Я впевнено впевнений, що можна писати реалізацію як стандартних бібліотек C, так і C ++, які переносяться на будь-яку платформу, яка підтримує POSIX.
Джеррі Труну

20

Я просто запитав це про себе і болів мозок кілька годин. Досі не знайшли нічого, що реально робить сенс. Усі, хто щось пише в тему, не в змозі насправді "навчити". Якщо ви хочете когось навчити, візьміть найосновнішу мову, яку людина розуміє, тому йому не потрібно дбати про інші теми при обробці теми. Тому я прийшов до висновку для себе, який, здається, добре вписується у весь цей хаос.

У мові програмування C кожна програма починається з функції main (). Інші мови можуть визначати інші функції, де програма запускається. Але процесор не знає main (). Процесор знає лише заздалегідь задані команди, представлені комбінаціями "0" і "1".

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

Ось, де надходить операційна система. Сама операційна система - це програма, яка працює на процесорі. Програма, яка дозволяє виконувати користувацький код. Запускає кілька програм одночасно, перемикаючись між кодами виконання програм (які завантажуються в ОЗУ). Але операційна система - ПРОГРАМА, кожна програма написана по-різному. Просто введення коду вашої користувальницької програми в оперативну пам'ять не запустить її, операційна система цього не знає. Вам потрібно викликати функції в операційній системі, яка реєструє вашу програму, сказати операційній системі, скільки пам’яті потрібно програмі, де знаходиться точка входу в програму (головна () функція у випадку С). І саме це, напевно, розташоване в RuntimeLibrary і пояснює, чому вам потрібна спеціальна бібліотека для кожної операційної системи,

Це також пояснює, чому він НЕ динамічно пов'язаний під час виконання, оскільки файли .dll є, навіть якщо він називається RUNTIMELibrary. Бібліотеку RuntimeLibrary потрібно пов’язати статично, тому що вона потрібна при запуску вашої програми. RuntimeLibrary вводить / підключає вашу власну програму до / до іншої програми (операційної системи) в RUNTIME. Це дійсно викликає певний мозок ...

Висновок: RUNTIMELбібліотека - це помилка в іменуванні. Можливо, там ще не було .dll (посилання на час виконання) в ранні часи, і питання розуміння різниці просто не існувало. Але навіть якщо це правда, ім’я погано вибране.

Кращими іменами RuntimeLibrary можуть бути: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

сподіваюсь, що я зрозумів це правильно, для корекції / розширення ура.


1
Я досі не отримую ідеї. Чому програмі потрібно щось під час виконання? Чому двійковий код не може запускатись на 100% самостійно, не підтримуючи його під час виконання? Або іншими словами: чи можна мати код, який працює на 100% без нічого (включаючи ОС)?
MarcioAB

5
Теоретично програмі не потрібен RTL. Однак як ваша програма коли-небудь відображатиме результат, або приймає будь-яку пам'ять для введення чи запиту без певної співпраці з операційною системою?
SN

16

C - це мова, і за її визначенням не потрібно мати жодних доступних вам функцій. Ніякого IO, ніяких математичних процедур тощо. За умовами, вам доступний набір підпрограм, які ви можете пов’язати у свій виконуваний файл, але не потрібно їх використовувати. Це, однак, така звичайна річ, що більшість линкерів більше не просять вас посилатися на бібліотеки C часу виконання.

Бувають випадки, коли ви цього не хочете - наприклад, у роботі із вбудованими системами, наприклад, мати недолік можна, наприклад, недоцільно. Раніше я працював над вбудовою 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 ().


1
Чи є структура і перелік справді бібліотекою часу виконання?
Дін П

6

Якщо ви користуєтесь таким інструментом, як Dependency Walker, у виконавчому файлі, складеному з C або C ++, ви побачите, що одна з DLL-файлів, від якої він залежить, це MSVCRT.DLL. Це бібліотека Microsoft C Runtime. Якщо ви далі вивчите MSVCRT.DLL за допомогою DW, ви побачите, що саме тут живуть усі функції, такі як printf (), put (0, get (), atoi () тощо.


6
Тільки якщо під час компіляції цього виконуваного файлу, час виконання C був пов'язаний динамічно. Якщо це було пов’язано статично, прогулянковий залежник покаже нічого,
Елі Бендерський,

4

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

Реалізація Microsoft стандартної бібліотеки часу виконання C забезпечує ...


3

Існує три форми бібліотеки часу виконання 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. 

32-розрядне видання Microsoft Visual C ++ містить і ці три форми, проте CRT у DLL має назву MSVCRT.LIB. DLL перерозподіляється. Його назва залежить від версії VC ++ (тобто MSVCRT10.DLL або MSVCRT20.DLL). Зауважте, що MSVCRT10.DLL не підтримується на Win32s, тоді як CRTDLL.LIB підтримується на Win32s. MSVCRT20.DLL випускається у двох версіях: одна для Windows NT, а друга для Win32s.

дивіться: http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.