2012-07-12 10 views
10

Mamy duży projekt,> 1M linii kodu w około 300 bibliotekach DLL. Do tej pory używaliśmy VS6.Ogromne pliki OBJ w kompilacji VS2008 C++ w porównaniu z VS6

Konwertowałem teraz wszystko na VS2008, wszystkie kompilacje, linki i co ważniejsze - działa!

==> Jednak ... wynikowe skompilowane pliki OBJ są większe o X 10, a łączenie jest bardzo powolne, z linkerem trafiającym często> 1 GB pamięci.

Częścią implikacji jest to, że muszę skompilować pewne zalążki za pomocą/bigobj.

Wynik to kompilacja, która trwała od około 1:45 na pulpicie do 3 godzin. Biblioteki DLL i biblioteki LIB mają mniej więcej taki sam rozmiar, jak w starej kompilacji VS6.

Przeczytałem wszystko, co mogłem tu znaleźć, ale nie znalazłem rozwiązania tego problemu. Jeśli jest to dodatkowa informacja DEBUG - nie chcę tego. Już miałem dość. Wydawana wielkość wzrosła, ale nie tak bardzo ...

Ktoś ma jakiś pomysł? Czy moja jedyna możliwość rozbicia projektów na znacznie mniejsze jednostki? Refaktoryzuje moją jedyną nadzieję ?! Z pewnością nie jest tajemnicą flag tęskniłem ...


Edit1 (13/07/2012 12: 20BST) Mam porównaniu DUMPBIN o Celu stworzonej przez VS6 vs VS2008. Ten w roku 2008 pojawia się jako, jak gdyby "statycznie łączący". W VS6 zawiera kilka symboli z aktualnej biblioteki DLL. W VS2008 zawiera symbole z (prawdopodobnie) wszystkich bibliotek, od których jest zależny. Rozmiary dyskietek wynoszą odpowiednio 66 kB i 32 000 kB dla VS6 i VS2008.


+2

Spróbuj wyłączyć "informacje debugowania" w ustawieniach projektu (gałąź C++). –

+7

_ "Mamy duży projekt,> 1M linii kodu w około 300 bibliotekach DLL.) Do tej pory używaliśmy VS6." _ Nigdy więcej nie będę narzekać na moją pracę. – Luke

+0

@IvanShcherbakov - czy nie przeszkodzi mi to w łatwym debugowaniu? – aabramovich

Odpowiedz

5

Sprawdź opcje debugowania. /Z7 powoduje, że duże pliki .OBJ, /Zi umieszczają te same informacje w oddzielnym pliku .PDB.

Opcja kompilatora /Oi może pomóc, podpowiadając funkcję wewnętrzną, która nie musi być już połączona. Prawdopodobnie i tak nie chcesz debugować memset.

Wyłącz /Gm (przyrostowa odbudowa), aby można było włączyć /MP (równoległe kompilowanie). Wyłącz także /Gy - podczas gdy dla mniejszych EXE, powoduje to większe pliki OBJ i wolniejsze łączenie.

+0

Dzięki @Malterowie Używamy/ZI Używamy/MP i GY jest wyłączony Grałem również z incremental vs. non-incremental linkage Non-incremental jest bolesne Bardzo Dodawanie/Oi teraz - zgłosi się w 12h – aabramovich

+0

Przyrostowy link kończy się z pamięci i nie mogę go obejść Rozmiar obiektu zmniejszył się o około 25%, ale wciąż są ogromne Nie mogę użyć flagi/3GB tyle programiści (erm) używają laptopów o ogólnej pojemności 3 GB ... Spróbuję zmienić OS, ponieważ mam XP ... – aabramovich

+1

Flaga '/ 3GB' odnosi się do Przestrzeń ddress dla zbudowanego pliku wykonywalnego i nie ma wpływu na kompilator lub sam linker. Co więcej, jest to 3 GB przestrzeni adresowej, która zawiera pliki mapowane w pamięci, a nie RAM. – MSalters