Wozu braucht C++ eine Laufzeitbibliothek?
-
Hallo,
ich hab folgende Frage: Wozu werden, wenn ich z.B. ein Programm mittels Visual Studio in C++ auf einem Windows-Betriebssystem kompiliere, Laufzeitbibliotheken (in Form der MSVC.dll) für den Start des Programms benötigt? Ich bin bisher immer davon ausgegangen, dass sprachspezifische Funktionen o.ä. aus C++ immer vom Compiler auf die OS-spezifischen Funktionen (in diesem Fall der WinAPI) abgebildet werden. In diesem Fall müsste es doch reichen, dass der Compiler bereits bei der Kompilierung die "Sprachmittel" in Aufrufe von Funktionen aus der kernel.dll, user32.dll usw. umsetzt? Liegt das Problem hierin vielleicht an der Lokalisierung der Einsprungspunkte im Speicher(die ja bei jeder Windows-Version afair unterschiedlich sind) oder wofür wird die Laufzeitbibliothek konkret benötigt? Und wie sieht der Fall bei anderen Betriebssystem aus?
-
Du musst einfach nur die statischen Libs verwenden dann geht das natürlich
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
mich würde das aber auch interessieren.
welche einstellungen muss man verwenden um alles statisch in einer binary unterzubringen?
-
Mit jeder MSVC-Version hat sich die Standard-Lib von C und C++ geändert. Z.B. ganz banal, das man Fehler behoben hat, sicherer gemacht hat, performance verbessert. Und im Extremfall hat man sogar die Standard-Lib erweitert oder mehr an den Standard angepasst. Also kannst du nicht mehr die im Windows mitgelieferte Standard-Lib verwenden. Es ist ja nicht so, das Windows keine Standard-Lib für C und C++ dabei hat!
Bei C++ kommt noch hinzu, das API-Aufrufe mit jeder Compiler-Version inkompatibel werden.
Bei Linux ist es ja auch nicht anders: da steigt dann z.B. Ubuntu von GCC 3.x auf Gcc 4.x mit großem Tam tam um, und die User müssen ihre Anwendungen neu kompilieren. Da fällt das "Runtime benötigen" nicht auf, weil die Sourcen immer für die aktuell auf dem Rechner installierte Runtime kompiliert werden. D.h. die Anwendungen richten sich nahc der GCC-Version.
Bei WIndows ist das umgekehrt: du als Entwickler bestimmst, welche Runtime benötigt wird, weil du es auf DEINEM Rechner kompilerst. Du könntest das natürlich wie unter Linux machen: deinem Kunden die Sourcen ausliefern, und der User kompiliert sich die Sourcen mit der MSVC-Version, die er auf seinem Rechner hat. Dann würde das "Runtime benötigen" auch nicht bewusst auffallen.
Bei Linux würde das auch der Fall sein, wenn es mehr Closed-SOurce geben würde: wenn du auf deinem Linux ein Closed-Source-Programm entwickelst, und es verteilst, müsstest du auch irgendwie sicherstellen, das der User die passende GCC-Runtime bekommt bzw. nutzt. Notfalls mitlieferst (aber die Details müssten die Linuxer erklären).
Will eigentlich damit nur sagen, das es kein MSVC-spezifische Eigenschaft ist, sondern jeden Compiler auf jeder Plattform betreffen kann.
-
Ike schrieb:
mich würde das aber auch interessieren.
welche einstellungen muss man verwenden um alles statisch in einer binary unterzubringen?Das ist von Compiler und IDE abhängig.
-
Wenn Du keine C-Funktionen verwendest, dann brauchst Du keine C-Runtime!
http://blog.kalmbach-software.de/2008/02/02/smallest-application-size-for-win32-console-application/
-
Bulli schrieb:
Ike schrieb:
mich würde das aber auch interessieren.
welche einstellungen muss man verwenden um alles statisch in einer binary unterzubringen?Das ist von Compiler und IDE abhängig.
in hinblick auf das unterforum in dem wir uns befinden, bin ich vom vcc und VS ausgegangen.
-
Mit jeder MSVC-Version hat sich die Standard-Lib von C und C++ geändert. Z.B. ganz banal, das man Fehler behoben hat, sicherer gemacht hat, performance verbessert. Und im Extremfall hat man sogar die Standard-Lib erweitert oder mehr an den Standard angepasst. Also kannst du nicht mehr die im Windows mitgelieferte Standard-Lib verwenden. Es ist ja nicht so, das Windows keine Standard-Lib für C und C++ dabei hat!
Okay, ich glaube, ich hab das Konzept doch noch nicht richtig durchschaut.
Ich nehme jetzt mal als einfachen Fall die Anweisung printf aus C bzw. das Objekt cout aus C++ als Beispiel. Bisher hatte ich immer gedacht, dass printf bzw. cout intern durch den Compiler durch eine Konstruktion wieWriteConsole("Der printf- bzw. cout übergebene Zeichenkette")
direkt 1:1 auf die WinAPI-Aufrufe abgebildet werden, also genau so, wie es Jochen Kalmbach in seinem Blog vorgeführt hat. Oder werden für Aufrufe der Standard-Lib gleichzeitig auch nochmals extra entsprechende Funktionen in den Runtimes definiert?
Für mich ergibt es jedenfalls wenig Sinn, jedes Mal die Runtime anzupassen(die dann letztlich doch auch nur auf OS-spezifische Bordmittel zurückgreifen können?!?) anstatt darauf zu achten, dass das Betriebssystem von Haus aus alle Funktionen anbietet, auf die dann die entsprechenden Sprachmittel abgebildet werden.
Also was hab ich hieran nicht verstanden?
-
Kannst Du nochmals ganz kurz rekapitulieren, was denn "printf" und "cout" ist!?
Und dann versuche mal Deine Frage selber zu beantworten
-
@Matzer123: ... und als Hilfe kannst Du einfach mal einen Blick in den CRT-Sourcecode werfen. Da wird einem nämlich klar wie die C-Runtime Befehle auf die WinAPI umgesetzt werden.