6

Nigdy nie przykładałem dużej wagi do różnicy wielkości między biblioteką statyczną a biblioteką dynamiczną, dopóki nie pobrałem już dzisiaj gotowych bibliotek doładowania. Odkryłem, że statyczne biblioteki boost są dużo większe niż biblioteki dynamiczne.Różnica wielkości między biblioteką statyczną i dynamiczną (debugowanie) a wpływem na ostateczny exe

Przykładowo debugowania wielowątkowy impuls fali statyczne biblioteki 97.7 mb wielkości przy tej samej biblioteki, ale dynamiczny tylko 1.4 mb wielkości (w tym biblioteki importu i DLL)! To ogromna różnica. Dlaczego tak jest?

Drugie pytanie, jeśli połączę statycznie z, powiedzmy, biblioteką wave. Czy to oznacza, że ​​mój plik wykonywalny będzie miał rozmiar większy niż 97.7 mb?

Odpowiedz

4

W statycznych bibliotekach znajdują się pełne informacje o symbolu debugowania. W przypadku bibliotek DLL informacje te znajdowałyby się w plikach .pdb (które, jak przypuszczam, miałyby podobny rozmiar do statycznych bibliotek).

Po utworzeniu łącza do statycznej biblioteki informacje o symbolu nie zostaną skopiowane do pliku .exe - zostanie on umieszczony w pliku .pdb (jeśli kompilacja jest skonfigurowana do tworzenia pliku .pdb). Plik .pdb nie musi być dystrybuowany z rozszerzeniem .exe, niezależnie od tego, czy plik .pdb jest tworzony.

W fabrycznie pobranej bibliotece, którą otrzymałem z boostpro.com, nie otrzymuję plików .pdb dla udostępnianych bibliotek DLL wspomagających. jeśli sam zbudujesz biblioteki DLL, prawdopodobnie dostaniesz pliki .pdb (choć może będziesz musiał ustawić opcję konfiguracji, dla której nie mam pojęcia, jakie są szczegóły).


zmiana:

Wygląda na to, że mogę się mylić łatwe uzyskiwanie .pdb pliki DLL impuls.Od http://comments.gmane.org/gmane.comp.lib.boost.build/23246:

> Is there an additional option that I can pass on the command line to 
> have the (correctly generated) PDB files also copied into the stage 
> directory? 

Nie w tej chwili. można siekać tylko tools/build/v2/tools/package.jam do dodać <install-type>PDB wszędzie gdzie <install-type>SHARED_LIB lub <install-type>STATIC_LIB jest teraz napisane.

+2

To bardzo interesujące ... czy kompilują biblioteki statyczne z informacjami debugowania? To nie pozwoli na optymalizację całego programu, a tym samym spowolnienie kodu (lub czy jestem tutaj w błędzie)? – Samaursa

+0

. Pliki .pdb zakładają system Windows/Visual Studio, który nie jest wymieniony w pytaniu (ale może być ważny). –

+0

@Tony: masz rację - powinienem był powiedzieć "Na mojej konfiguracji ..." –

3

Nie, tylko dlatego, że plik LIB ma określony rozmiar, nie oznacza, że ​​doda ten rozmiar do pliku EXE. W rzeczywistości większość łączników jest wystarczająco inteligentna, aby łączyć tylko te elementy, które są używane. Porównaj to z biblioteką dynamiczną, która musi zawierać wszystko.

Biblioteki statyczne zdecydowanie zwiększają twój EXE, ale ja zawsze wolę. Wtedy nie muszę się martwić o brakujące lub niekompatybilne biblioteki w czasie wykonywania. (Lub przynajmniej zminimalizować szanse na to.)

0

Biblioteka statyczna debugowania zawiera informacje debugowania, co wyjaśnia ogromną różnicę wielkości.

1

Ponieważ biblioteki statyczne nie zawierają gotowych danych binarnych, ale raczej informacje potrzebne do linkera do zbudowania pliku binarnego, informacje te mogą być większe niż zbudowane pliki binarne.

Gdy jakaś funkcja zdefiniowana w pliku nagłówkowym jest używana w pliku cpp, kompilator umieszcza swój kod (wstawia lub po prostu dodaje) do wynikowego pliku obiektu. Oznacza to, że będzie dużo duplikatów. Zadaniem linkera jest ich scalenie, więc statyczna biblioteka czeka na zmniejszenie linkera :)

Zwykle rozmiar pliku wykonywalnego jest zwykle większy w przypadku bibliotek statycznych, ale rozmiar pliku wykonywalnego wraz z bibliotekami dynamicznymi jest zwykle mniejszy. DLL i EXE są połączone osobno, więc linker nie może wiedzieć, która funkcjonalność jest wymagana w DLL, a które można wyrzucić. W przypadku biblioteki statycznej linker ma takie informacje i może pobierać tylko te pliki obj, które są używane.

Powiązane problemy