2010-07-26 21 views
7

Mam skompilowaną w C++ bibliotekę statyczną z około 15 klasami oraz ich funkcje składowe i inne, a skompilowane, to prawie 14 megabajtów. Łączy się z gęstą biblioteką tabeli mieszania Google i MPIR, która jest podobna do GMP dla Windows, ale zrobiłem to w zwykłym exe i było to kilka kilobajtów. Dlaczego jest tak masywny? Co mogę zrobić, aby zmniejszyć jego rozmiar? Wygląda na to, że istnieją inne programy, które są o wiele bardziej skomplikowane niż moje, które są znacznie mniejsze.Dlaczego moja biblioteka statyczna jest tak ogromna?

skompilowany z Visual C++, linia poleceń jest:

/Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" 
/D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t 
/Zc:forScope /Fp"Release\ang.pch" /Fa"Release\" /Fo"Release\" 
/Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue 
+0

Czy możesz podać więcej konkretnych informacji? Kompilator, flagi kompilacji itp. – Dusty

+0

W kompilacji z Visual C++, wiersz poleceń: /Zi/nologo/W3/WX-/O2/Oi/Oy-/GL/D "WIN32"/D "NDEBUG"/D "_CONSOLE "/ D" _UNICODE "/ D" UNICODE "/ Gm-/EHsc/GS/Gy/fp: exact/Zc: wchar_t/Zc: forScope /Fp"Release\ang.pch"/Fa "Release \"/Fo " Release \ "/Fd"Release\vc100.pdb"/Gd/analyze-/errorReport: queue – Foglio

+0

Wiersz poleceń *, a nie flagi. – Foglio

Odpowiedz

16

Biblioteka statyczna jest znacznie inny format końcowy binarny; częściowo dlatego, że ma dość więcej informacji. Zasadniczo biblioteka statyczna działa jak plik ZIP wszystkich plików .obj wygenerowanych z twoich jednostek tłumaczeniowych. Dzięki temu linker może wyrzucać nieużywane funkcje, a jeśli korzystasz z LTCG, pozwala inlinerowi podejmować decyzje między modułami i inne tego typu optymalizacje.

Ponadto niektóre tryby kompilacji osadzają symbole debugowania bezpośrednio w pliku .lib, eliminując potrzebę oddzielnych plików .pdb.

Generalnie nie powinieneś się martwić o rozmiar biblioteki statycznej; linker wyrzuci wszystkie dodatkowe informacje podczas budowania końcowego pliku wykonywalnego.

+0

Łącznik wyrzuca również kod nadmiarowy i martwy, itp. – greyfade

+0

@ greyfade: Właściwie to robi to kompilator;) –

+0

@Billy ONeal: At * link time *? – greyfade

Powiązane problemy