VC++ erzeugt riesige statische Lib!?



  • Ich verwende Visual C++ 2008. In meinem Programm verwende ich boost::wformat, lexical_cast und scoped_arry. Soweit ich richtig informiert bin, sind das "Header only" Templates die keine weiteren DLLs benötigen. Ansonsten arbeite ich nur noch mit den Standard-Klassen string, vector und deque. Alle .obj Dateien in denen C++ Klassen oder boost benutzt werden sind mind. 1.5MB groß, bei reinen C-Source Dateien sind es meistens nur ca. 200KB. So ist es klar warum meine statische Lib so groß wird, wenn einfach alle .obj zusammengefasst werden. Die Frage ist aber, warum sind die .obj so groß und wie könnte ich sie kleiner bekommen?



  • yogle schrieb:

    Soweit ich richtig informiert bin, sind das "Header only" Templates die keine weiteren DLLs benötigen.

    Und jetzt darfst DU dreimal Raten, wo der Code landet, wenn Du sonst keine DLLs mehr brauchst? Je genau, in Deiner LIB.

    yogle schrieb:

    So ist es klar warum meine statische Lib so groß wird, wenn einfach alle .obj zusammengefasst werden.

    Ganz genau. Das ist eine LIB.

    yogle schrieb:

    Die Frage ist aber, warum sind die .obj so groß und wie könnte ich sie kleiner bekommen?

    Weil Instanziierte Templates i.d.R. sehr viel Code brauchen...



  • Jochen Kalmbach schrieb:

    yogle schrieb:

    Soweit ich richtig informiert bin, sind das "Header only" Templates die keine weiteren DLLs benötigen.

    Und jetzt darfst DU dreimal Raten, wo der Code landet, wenn Du sonst keine DLLs mehr brauchst? Je genau, in Deiner LIB.

    yogle schrieb:

    So ist es klar warum meine statische Lib so groß wird, wenn einfach alle .obj zusammengefasst werden.

    Ganz genau. Das ist eine LIB.

    Im Prinzip sagst du rein gar nichts neues. Das Code nicht verschwinden kann ist jedem klar und das alle .obj Dateien zusammen eine statische Lib ergeben auch. Doch erkläre mir mal bitte das Verhältniss von 1:80 einer dynamischen zu einer statischen Lib mit der gleichen Codebasis! Wenn das was in den .obj (im Release-Mode) nur Code sein soll und deshalb die statische Lib 40MB haben soll, wie kann dann die dynamische Lib nur 500kB haben und auch keine weiteren DLLs benötigen? Wohin verschwindet denn nun der ganze Code?

    Einzig irgendwie erklären könnte ich es mir folgendermaßen: In jeder .obj Datei steht der Code mit allen (Code-)Abhänigkeiten für diese eine .obj Datei. Für die statische Lib, werden alle .obj Dateien stupide zusammengepackt -> riesige Lib mit mehrmals gleichem Code, da viele .obj Dateien die gleichen (Code-)Abhänigkeiten wie z.b. std::string usw. haben. Bei der DLL merkt das der Linker und packt den Code von z.B. std::string ein mal rein und schmeißt diesen aus der anderen .obj Dateien raus.



  • Die LIB einer DLL einthält *keinen* Code. Sondern nur verweise auf die DLL. Deshalb ist logischerweise die LIB einer DLL *wesentlich* kleiner. Dafür gibt es dann aber die DLL....



  • Jochen Kalmbach schrieb:

    Die LIB einer DLL einthält *keinen* Code. Sondern nur verweise auf die DLL. Deshalb ist logischerweise die LIB einer DLL *wesentlich* kleiner. Dafür gibt es dann aber die DLL....

    Völlig richtig. Vielleicht lag hier eine sprachliche Verwechslung vor, allerdings sprach und spreche ich die ganze Zeit bewusst über statische und dynamisch Librarys. Nicht über die Lib einer DLL! Das Verhältniss 1:80 ist wirklich das Verhältnis meiner dynamischen (500kB) zu meiner statischen (40MB) Library, welche beide die gleiche Codebasis haben! Die DLL hat natürlich noch eine zugehörige .lib Datei die nur Verweise enthällt, um die es aber nicht geht.

    Im Prinzip ist es auch egal, so wie es aussieht lässt sich die Größe der statische Lib nicht verkleinern. Ein Trick wäre natürlich über spezielle Tools (z.B. http://www.binary-soft.com/dll2lib/dll2lib.htm) aus meiner DLL eine statische Lib zu basteln. Diese hätte dann auch nur die Größe der DLL aber das ist etwas viel rumgebastel und 999$ für eine Lizens, die haben sie ja nicht mehr alle 🙂

    Edit: Oder ich packe alles in ein Source-File, dann sollte sie auch kleiner werden 😃



  • Klär mich mal auf: Was ist eine "dynamische LIB" und eine "statische LIB"?
    DU meinst jetzt aber nicht /MD oder /MT, oder?



  • Jochen Kalmbach schrieb:

    Klär mich mal auf: Was ist eine "dynamische LIB" und eine "statische LIB"?
    DU meinst jetzt aber nicht /MD oder /MT, oder?

    Nein, ich meine: Configuration Properties -> General -> Configuration Type -> Static Library (.lib) oder Dynamic Library (.dll)

    Zu /MD oder /MT hätte ich aber auch noch ne Frage. Wer statische Librarys in seine Application (.exe) einbinden möchte, muss ja die gleiche Runtime wie die statische Library verwenden. Also eben auch /MD, MDd oder /MT, /MTd. Muss man denn auch die gleiche Version nehmen? Soll heißen, kann die statische Library z.B. mit VC++ 2008 und /MT kompiliert werden und die Application mit VC++ 2005 und ebenfalls mit /MT?



  • yogle schrieb:

    Nein, ich meine: Configuration Properties -> General -> Configuration Type -> Static Library (.lib) oder Dynamic Library (.dll)

    Und *warum* ist Dir dann nicht klar, dass eine "dynamische LIB" *wesentlich* kleiner ist (sie enthält ja *nur* die Verweise auf die DLL! Und Du brauchst dann die DLL, zum ausführen....

    Oder hab ich jetzt irgendwas verpasst?



  • Bzgl. /MT/D 2005/2008:
    Prinzipiell gilt:
    Wenn Du eine (statisch) LIB erstellst, dann musst Du genau für *jede* VS-Version und jede Variante (/MT /MD, usw) genau *eine* LIB erstellen. ALso schlimmstenfalls ca. 64 LIBs, ja nachdem welche Compiler-Versionen mit welchen Einstellungen Du unterstützen willst.

    Erzeugst Du eine (dynamische LIB) DLL, und verwendest *einfache C-Interfaces*, so benötigst Du nur eine (bzw. zwei) DLLs/LIBs.



  • Jochen Kalmbach schrieb:

    yogle schrieb:

    Nein, ich meine: Configuration Properties -> General -> Configuration Type -> Static Library (.lib) oder Dynamic Library (.dll)

    Und *warum* ist Dir dann nicht klar, dass eine "dynamische LIB" *wesentlich* kleiner ist (sie enthält ja *nur* die Verweise auf die DLL! Und Du brauchst dann die DLL, zum ausführen....

    Oder hab ich jetzt irgendwas verpasst?

    Es ist mir durchaus klar und das habe ich zwei Posts weiter oben schon versucht zu beschreiben. Ich will mal kurz zusammenfassen, weil ich so langsam müde geworden bin es immer wieder zu erklären. Es gibt:

    - Die statische Library (.lib) mit der Codebasis X (Größe 40MB)

    - Die dynamische Library (.dll) mit ebenfalls der Codebasis X (Größe 500kB)
    und die dazugehörige "Verweiße-Lib" (.lib), die eben nur Verweiße auf die .dll hat. (Größe sehr klein, unwichtig)

    So und mir ging es immer darum, dass ich meinen Code (die Codebasis 😵 einmal als statische Lib und einmal als dynamisch Lib verteilen wollte. Da nun aber die ganzen Probleme auftreten (enorme Größe und 64 Versionen für jede VS Version) hat sich das glaube ich gleich erledigt. Aber trotzdem danke für deine Bemühungen.


Anmelden zum Antworten