2013-04-30 96 views
15

Przeszliśmy przez punkty wymienione na MSDN WRT do tego błędu (z wyjątkiem # 5). Trzy różne osoby na różnych maszynach mają ten sam problem. WPB jest tworzony, ale kończy się gdzieś pośrodku.LNK1201 Visual C++ 2010 Duży projekt nie generuje PDB

Szczegóły:

  • 67 statycznych bibliotek
  • 4.27 GB bibliotek statycznych
  • 1048575 bajtów - Rozmiar WPB kiedy linker nie
  • Ostatnie kilka megabajtów WPB są nieważne (zera)
  • Wydanie kompilacji powiedzie się & tworzy PDB (włączamy go bez informacji o debugowaniu w exe)
  • Release build PDB ma nieco mniej niż 1 GB.

Mamy wyłączone skanery antywirusowe. Oglądane z procmon.exe i nie widziałem żadnych podejrzeń interakcji z PDB, gdy linker zawiódł.

Related question sugeruje ~ 1 GB limitu na PDB - ktoś/sposób potwierdzenia?

UPDATE & ROZWIĄZANIE:

@Barry i zespół chrom wymyślić rozwiązania. Here to łata do systemu kompilacji Chromium, która implementuje rozdzielczość.

Szczegóły
PDB wykorzystuje wirtualny system plików wewnętrznie: MSF. Kiedy linker tworzy plik PDB, domyślnie jest to (najwyraźniej nie konfigurowalny) rozmiar strony 2 kB. Najwyraźniej & na szczęście, gdy kompilator tworzy swój PDB, domyślnie rozmiar strony wynosi 4 kB. To PDB kompilatora może być podniesione i użyte jako baza dla PDB łącznika.

lepszym rozwiązaniem Jako Pre-Link Event nad projektem, który jest łączącego swój exe lub dll możemy podnosić kompilator do generowania naszą wymaganą początkową PDB:

cl -c "dummy_empty.cpp" /Zi /Fd"$(TargetDir)$(TargetName).pdb" 

oryginalne rozwiązanie
Utwórz projekt biblioteki statycznej C++ z pustym plikiem cpp, skonfiguruj "Nazwę pliku bazy danych programu Porgram", aby wyprowadzała coś innego niż domyślna. Użyj niektórych zdarzeń budowania projektu (użyłem "Zdarzenia Pre-Link"), aby skopiować wcześniej utworzony PDB do miejsca, w którym spodziewasz się linkera (patrz Linker-> Generuj plik bazy danych programu), aby utworzyć jego PDB. Na szczęście linker przyjmie skopiowany w PDB i wykorzysta jego rozmiar strony 4 kB. To da trochę czasu i trochę miejsca, pozwalając nawet na 2 GB PDB.

+0

Inkrementalne kompilacje powodowały takie problemy. Czy dzieje się to podczas kompletnej przebudowy po czystym? –

+0

Tak, dzieje się to podczas kompilacji i przebudowy. Uważam, że połączenie przyrostowe jest wyłączone, ale mamy podwójną kontrolę. – Zac

Odpowiedz

6

Istnieje rzeczywiście limit maks. 1GB dla rozmiaru pdb. Istnieje pewna sztuczka, aby przedłużyć to do 2GB (więcej informacji na ten temat można znaleźć Here). Zasadniczo musisz sam wygenerować początkowy plik pdb zamiast kompilatora.

Inną czynnością, którą można zrobić, jest aktywne podciąganie kodu szablonu, ponieważ może to wpłynąć na rozmiary pdb.

+0

Link do odpowiedniego zestawu zmian w chromie: https://chromium.googlesource.com/experimental/external/gyp/+/9ee1e40e50f3148f691965a0829709f0d25b0412 –

0

Czy próbowałeś zmniejszyć liczbę równoległych kompilacji. Ustawienie w dowolnym miejscu w IDE. W VC9 mieliśmy podobny problem, a naszym jedynym rozwiązaniem było zmniejszenie liczby lokalnych wersji. Czy to może być problem z pamięcią? Czy używasz VC 10 SP1?

+0

Wszystko jest w porządku - więc nie jestem pewien, dlaczego kompilacje/MP miałyby wpływ. Obawiamy się, że linkerowi brakuje pamięci, jest to 32-bitowa wersja (32-bitowy linker.exe). Używamy SP1. – Zac

5

Połączyłem program testowy z plikami 1000 cpp, każdy cpp z jedną funkcją, która tworzyła 500 unikalnych typów szablonów.

Link.exe nie powiodło się, gdy plik PDB osiągnął: 1048575 KB.

Wydaje się być pewnym twardym limitem przy 1 GB w formacie PDB lub LINK.exe.