Was ist die C-Laufzeitbibliothek?

157

Was ist eigentlich eine C-Laufzeitbibliothek und wofür wird sie verwendet? Ich habe gesucht, gegoogelt wie ein Teufel, aber ich konnte nichts Besseres als das von Microsoft finden: "Die Microsoft-Laufzeitbibliothek bietet Programmierroutinen für das Microsoft Windows-Betriebssystem. Diese Routinen automatisieren viele gängige Programmieraufgaben, die nicht von bereitgestellt werden die Sprachen C und C ++. "

OK, das verstehe ich, aber was ist zum Beispiel drin libcmt.lib? Was tut es? Ich dachte, dass die C-Standardbibliothek ein Teil des C-Compilers ist. So ist libcmt.libWindows-Implementierung von C - Standardbibliothek Funktionen zur Arbeit unter win32?

B.Gen.Jack.O.Neill
quelle

Antworten:

71

Ja, libcmt ist (eine von mehreren) Implementierungen der C-Standardbibliothek, die mit dem Microsoft-Compiler bereitgestellt wird. Sie bieten sowohl "Debug" - als auch "Release" -Versionen von drei Grundtypen von Bibliotheken: Single-Threaded (immer statisch verknüpft), Multithread-statisch verknüpft und Multithread-dynamisch verknüpft (abhängig von der Compilerversion, die Sie verwenden unter Verwendung einiger davon möglicherweise nicht vorhanden).

Im Namen "libcmt" ist "libc" der (mehr oder weniger) traditionelle Name für die C-Bibliothek. Das "mt" bedeutet "Multithread". Bei einer "Debug" -Version würde am Ende ein "d" hinzugefügt, was "libcmtd" ergibt.

In Bezug auf die darin enthaltenen Funktionen definiert der C-Standard (Teil 7, falls Sie sich darum kümmern) eine Reihe von Funktionen, die eine konforme (gehostete) Implementierung bereitstellen muss. Die meisten Anbieter (einschließlich Microsoft) fügen selbst verschiedene andere Funktionen hinzu (aus Kompatibilitätsgründen, um Funktionen bereitzustellen, die von den Standardfunktionen nicht angesprochen werden usw.). In den meisten Fällen enthält es auch einige "interne" Funktionen, die vom Compiler verwendet werden aber normalerweise nicht vom Endbenutzer.

Wenn Sie eine vollständige Liste der Funktionen in "libcmt" erhalten möchten (um Ihr Beispiel zu verwenden), können Sie eine der Visual Studio-Eingabeaufforderungen öffnen (normalerweise unter "Visual Studio Tools") und in das Verzeichnis wechseln, in dem sich Ihre Bibliotheken befanden installiert, und geben lib -list libcmt.libSie Folgendes ein : und es wird eine ( lange ) Liste der Namen aller Objektdateien in dieser Bibliothek generiert . Diese entsprechen nicht immer direkt den Namen der Funktionen, geben aber im Allgemeinen eine Idee. Wenn Sie sich eine bestimmte Objektdatei ansehen möchten, können Sie lib -extracteine dieser Objektdateien extrahieren und dann dumpbin /symbols <object file name>ermitteln, welche Funktionen in dieser bestimmten Objektdatei enthalten sind.

Jerry Sarg
quelle
37
Sie haben nicht gesagt, was "C-Laufzeitbibliothek" ist !!
onmyway133
4
@entropy: Sicher sieht es für mich so aus wie ich, aber die kurze Antwort lautet, dass es sich um eine Sammlung von Funktionen handelt, von denen viele (aber nicht unbedingt alle) in Teil 7 des C-Standards angegeben sind.
Jerry Coffin
3
Diese Antwort impliziert, dass C-Bibliotheken nur ein Teil der Compiler-Toolchains sind. Nicht genau.
Jiggunjer
@ JerryCoffin Frage: Hätte die strcpyFunktion aus der C-Standardbibliothek beispielsweise eine Implementierung in der Laufzeitbibliothek oder nur Code in normalen C-Dateien?
Forumulator
@forumulator: Normalerweise enthält eine .c-Datei Quellcode, der kompiliert wird, um die richtige Standardbibliothek zu erstellen (die ..dll, lib, .a, .so oder was auch immer für das von Ihnen verwendete System gilt). .
Jerry Coffin
55

Zuerst sollten wir verstehen, was eine Laufzeitbibliothek ist. und überlegen Sie, was es mit "Microsoft C Runtime Library" bedeuten könnte.

Siehe: http://en.wikipedia.org/wiki/Runtime_library

Ich habe den größten Teil des Artikels hier gepostet, da er möglicherweise aktualisiert wird.

Wenn der Quellcode eines Computerprogramms von einem Compiler in die jeweilige Zielsprache übersetzt wird, würde dies zu einer extremen Vergrößerung des Programmcodes führen, wenn jeder Befehl im Programm und jeder Aufruf einer integrierten Funktion die direkte Generierung verursachen würde jedes Mal den vollständigen Programmcode in der Zielsprache. Stattdessen verwendet der Compiler häufig compilerspezifische Zusatzfunktionen in der Laufzeitbibliothek, auf die Anwendungsprogrammierer meist nicht zugreifen können. Je nach Compilerhersteller enthält die Laufzeitbibliothek manchmal auch die Standardbibliothek des jeweiligen Compilers oder ist darin enthalten.

Außerdem sind einige Funktionen, die nur zur Laufzeit ausgeführt werden können (oder effizienter oder genauer sind), in der Laufzeitbibliothek implementiert, z. B. einige Logikfehler, Überprüfung der Array-Grenzen, Überprüfung des dynamischen Typs, Ausnahmebehandlung und möglicherweise Debugging-Funktionen. Aus diesem Grund werden einige Programmierfehler erst entdeckt, wenn das Programm in einer "Live" -Umgebung mit realen Daten getestet wurde, trotz ausgefeilter Überprüfung der Kompilierungszeit und Tests vor der Veröffentlichung. In diesem Fall kann der Endbenutzer eine Laufzeitfehlermeldung erhalten.

Normalerweise realisiert die Laufzeitbibliothek viele Funktionen durch Zugriff auf das Betriebssystem. Viele Programmiersprachen verfügen über integrierte Funktionen, die nicht unbedingt im Compiler realisiert werden müssen, sondern in der Laufzeitbibliothek implementiert werden können. Die Grenze zwischen Laufzeitbibliothek und Standardbibliothek liegt also beim Compilerhersteller. Daher ist eine Laufzeitbibliothek immer compilerspezifisch und plattformspezifisch.

Das Konzept einer Laufzeitbibliothek sollte nicht mit einer normalen Programmbibliothek verwechselt werden, wie sie von einem Anwendungsprogrammierer erstellt oder von einem Drittanbieter oder einer dynamischen Bibliothek bereitgestellt wird, dh einer zur Laufzeit verknüpften Programmbibliothek. Beispielsweise erfordert die Programmiersprache C nur eine minimale Laufzeitbibliothek (üblicherweise als crt0 bezeichnet), definiert jedoch eine große Standardbibliothek (als C-Standardbibliothek bezeichnet), die jede Implementierung bereitstellen muss.

Fantagons
quelle
3
Der hervorgehobene Satz zur Unterscheidung von der Standardbibliothek ist die erste präzise und genaue Antwort, die ich nicht mit "am meisten" oder "manchmal" qualifiziert gesehen habe.
Nik.shornikov
@ nik.shornikov: Das liegt daran, dass andere Beschreibungen versuchen, genauer zu sein. Obwohl es stimmt, dass eine Standardbibliothek normalerweise spezifisch für einen Compiler und eine Plattform ist, ist dies nicht immer der Fall. Zum Beispiel haben zumindest einige Versionen von Mingw und Intels C ++ - Compiler für Windows die Standardbibliothek von Microsoft verwendet, anstatt ihre eigene bereitzustellen. Ebenso kann (und wird häufig) Clang unter Linux installiert werden, um die Standardbibliothek in einer vorhandenen Installation von gcc zu verwenden, anstatt eine andere für sich selbst zu installieren.
Jerry Coffin
Ich bin mir ziemlich sicher, dass es möglich ist, Implementierungen der C- und C ++ - Standardbibliotheken zu schreiben, die auf jede Plattform portierbar sind, die POSIX unterstützt.
Jerry Coffin
20

Ich habe das nur selbst gefragt und habe mir einige Stunden lang das Gehirn verletzt. Ich habe immer noch nichts gefunden, was wirklich Sinn macht. Jeder, der etwas zu einem Thema schreibt, kann nicht wirklich "unterrichten". Wenn Sie jemanden unterrichten möchten, nehmen Sie die grundlegendste Sprache, die eine Person versteht, damit sie sich beim Umgang mit einem Thema nicht um andere Themen kümmern muss. Also bin ich zu einem Schluss gekommen, der gut in all dieses Chaos zu passen scheint.

In der Programmiersprache C startet jedes Programm mit der Funktion main (). Andere Sprachen definieren möglicherweise andere Funktionen, in denen das Programm gestartet wird. Ein Prozessor kennt main () jedoch nicht. Ein Prozessor kennt nur vordefinierte Befehle, die durch Kombinationen von "0" und "1" dargestellt werden.

Bei der Mikroprozessorprogrammierung ohne zugrunde liegendes Betriebssystem (Microsoft Windows, Linux, MacOS usw.) müssen Sie dem Prozessor explizit mitteilen, wo er beginnen soll, indem Sie den ProgrammCounter (PC) festlegen, der iteriert und springt (Schleifen, Funktionsaufrufe) die dem Prozessor bekannten Befehle. Sie müssen wissen, wie groß der RAM ist, Sie müssen die Position des Programmstapels (lokale Variablen) sowie die Position des Heaps (dynamische Variablen) und die Position globaler Variablen (z. B. SSA) festlegen ?) im RAM. Ein einzelner Prozessor kann jeweils nur ein Programm ausführen.

Hier kommt das Betriebssystem ins Spiel. Das Betriebssystem selbst ist ein Programm, das auf dem Prozessor ausgeführt wird. Ein Programm, mit dem benutzerdefinierter Code ausgeführt werden kann. Führt mehrere Programme gleichzeitig aus, indem zwischen den Ausführungscodes der Programme (die in den RAM geladen werden) gewechselt wird. Aber das Betriebssystem ist ein Programm, jedes Programm ist anders geschrieben. Wenn Sie den Code Ihres benutzerdefinierten Programms einfach in den Arbeitsspeicher stellen, wird er nicht ausgeführt, das Betriebssystem kennt ihn nicht. Sie müssen Funktionen des Betriebssystems aufrufen, das Ihr Programm registriert, und dem Betriebssystem mitteilen, wie viel Speicher das Programm benötigt, wo sich der Einstiegspunkt in das Programm befindet (die main () - Funktion bei C). Und genau das befindet sich in der RuntimeLibrary und erklärt, warum Sie für jedes Betriebssystem eine spezielle Bibliothek benötigen.

Dies erklärt auch, warum es zur Laufzeit NICHT dynamisch verknüpft wird wie DLL-Dateien, selbst wenn es RUNTIMELibrary heißt. Die RuntimeLibrary muss statisch verknüpft sein, da sie beim Start Ihres Programms benötigt wird. Die RuntimeLibrary injiziert / verbindet Ihr benutzerdefiniertes Programm bei RUNTIME mit einem anderen Programm (dem Betriebssystem). Dies führt wirklich dazu, dass ein Gehirn ...

Schlussfolgerung: RUNTIMELibrary ist ein Fehler bei der Benennung. Möglicherweise gab es in den frühen Zeiten keine DLL (Verknüpfung zur Laufzeit), und das Problem, den Unterschied zu verstehen, gab es einfach nicht. Aber selbst wenn dies wahr ist, ist der Name schlecht gewählt.

Bessere Namen für die RuntimeLibrary könnten sein: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

Ich hoffe, ich habe es richtig gemacht, bis zur Korrektur / Erweiterung.

Rumpeln
quelle
1
Ich verstehe die Ideia immer noch nicht. Warum braucht ein Programm zur Laufzeit etwas? Warum kann der Binärcode nicht zu 100% alleine ausgeführt werden, ohne dass ihn zur Laufzeit irgendetwas unterstützt? Oder mit anderen Worten: Ist es möglich, einen Code zu haben, der zu 100% ohne irgendetwas ausgeführt wird (einschließlich des Betriebssystems)?
MarcioAB
5
In der Theorie ist ein Programm nicht braucht eine RTL. Wie würde Ihr Programm jedoch jemals das Ergebnis anzeigen oder einen Eingabe- oder Anforderungsspeicher verwenden, ohne dass das Betriebssystem mitarbeitet?
SN
16

C ist eine Sprache und in ihrer Definition müssen Ihnen keine Funktionen zur Verfügung stehen. Keine E / A, keine mathematischen Routinen und so weiter. Vereinbarungsgemäß gibt es eine Reihe von Routinen zur Verfügung , um Ihnen , dass Sie in der ausführbaren Datei verknüpfen können, aber Sie nicht brauchen sie zu benutzen. Dies ist jedoch so häufig der Fall, dass die meisten Linker Sie nicht mehr auffordern, eine Verknüpfung zu den C-Laufzeitbibliotheken herzustellen.

Es gibt Zeiten, in denen Sie sie nicht möchten - zum Beispiel kann es bei der Arbeit mit eingebetteten Systemen unpraktisch sein, Malloc zu haben. Früher habe ich daran gearbeitet, PostScript in Drucker einzubetten, und wir hatten unsere eigenen Laufzeitbibliotheken, die auf eingebetteten Systemen viel zufriedener waren, sodass wir uns nicht mit dem "Standard" beschäftigten.

Sockel
quelle
11
Tatsächlich beschreiben die C - Normen zwei Arten von C - Umgebungen - „freistehend“ und „Gastgeber“ - und in den gehosteten Umgebungen beschriebene Funktionen in den Normen sind als verfügbar definiert. In eingebetteten Systemen ist die C-Umgebung normalerweise freistehend, sodass Sie möglicherweise nicht über die Bibliotheksroutinen verfügen oder die Verwendung einiger Routinen vermeiden und Ihre eigenen Ersetzungen verwenden können.
10

Die Laufzeitbibliothek ist die Bibliothek, die automatisch für jedes von Ihnen ausgeführte C-Programm kompiliert wird. Die Version der Bibliothek, die Sie verwenden würden, hängt von Ihrem Compiler, Ihrer Plattform, den Debugging-Optionen und den Multithreading-Optionen ab.

Eine gute Beschreibung der verschiedenen Auswahlmöglichkeiten für Laufzeitbibliotheken: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Es enthält die Funktionen, von denen Sie normalerweise nicht glauben, dass sie eine Bibliothek zum Aufrufen benötigen:

  • malloc
  • enum, struct
  • abs, min
  • behaupten

Microsoft hat eine schöne Liste ihrer Laufzeitbibliotheksfunktionen:

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

Die genaue Liste der Funktionen hängt vom Compiler ab, sodass Sie für iOS andere Funktionen wie dispatch_async () oder NSLog () erhalten.

Arinmorf
quelle
1
Ist struct and enum wirklich eine Laufzeitbibliothek?
Dean P
6

Wenn Sie ein Tool wie Dependency Walker für eine aus C oder C ++ kompilierte ausführbare Datei verwenden, werden Sie feststellen, dass eine der DLLs, von denen es abhängig ist, MSVCRT.DLL ist. Dies ist die Microsoft C Runtime Library. Wenn Sie MSVCRT.DLL mit DW weiter untersuchen, werden Sie feststellen, dass hier alle Funktionen wie printf (), Puts (0, Gets (), Atoi () usw. aktiv sind.


quelle
6
Nur wenn beim Kompilieren dieser ausführbaren Datei die C-Laufzeit dynamisch verknüpft wurde. Wenn es statisch verknüpft war, zeigt der Abhängigkeitsläufer nichts
Eli Bendersky
4

Ich denke, die Definition von Microsoft bedeutet wirklich:

Die Microsoft-Implementierung der Standard-C-Laufzeitbibliothek bietet ...

Andrey
quelle
3

Es gibt drei Formen der C-Laufzeitbibliothek, die mit dem Win32 SDK bereitgestellt werden:

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

Die 32-Bit-Edition von Microsoft Visual C ++ enthält auch diese drei Formulare. Die CRT in einer DLL heißt jedoch MSVCRT.LIB. Die DLL ist weiterverteilbar. Sein Name hängt von der Version von VC ++ ab (dh MSVCRT10.DLL oder MSVCRT20.DLL). Beachten Sie jedoch, dass MSVCRT10.DLL unter Win32s nicht unterstützt wird, während CRTDLL.LIB unter Win32s unterstützt wird. MSVCRT20.DLL gibt es in zwei Versionen: eine für Windows NT und die andere für Win32s.

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

Michael
quelle