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.lib
Sie 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 -extract
eine dieser Objektdateien extrahieren und dann dumpbin /symbols <object file name>
ermitteln, welche Funktionen in dieser bestimmten Objektdatei enthalten sind.
strcpy
Funktion aus der C-Standardbibliothek beispielsweise eine Implementierung in der Laufzeitbibliothek oder nur Code in normalen C-Dateien?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.
quelle
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.
quelle
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.
quelle
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:
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.
quelle
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
Ich denke, die Definition von Microsoft bedeutet wirklich:
quelle
Es gibt drei Formen der C-Laufzeitbibliothek, die mit dem Win32 SDK bereitgestellt werden:
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
quelle