2013-04-30 9 views
15

Abbiamo superato i punti elencati su MSDN WRT per questo errore (eccetto per # 5). Tre persone diverse su macchine diverse stanno ottenendo lo stesso problema. Il PDB viene creato, ma fallisce da qualche parte nel mezzo.LNK1201 Visual C++ 2010 Progetto di grandi dimensioni che non riesce a generare PDB

Dettagli:

  • 67 librerie statiche
  • 4.27 GB di librerie statiche
  • 1048575 byte - dimensioni del PPB quando linker non riesce
  • L'ultimo paio di megabyte di PPB sono nulli (zero del
  • Il build di sblocco ha esito positivo & produce un PDB (lo abbiamo acceso, senza informazioni di debug nell'exe)
  • Rilascio build PDB è poco meno di 1 GB.

Abbiamo disattivato i programmi antivirus. Controllato con procmon.exe e non ha rilevato interazioni di sospetto con il PDB quando il linker non è riuscito.

Related question suggerisce il limite di ~ 1 GB sui PDB - Qualcuno/modo per confermarlo?

UPDATE & SOLUZIONE:

@Barry e la squadra di cromo hanno escogitato la soluzione. Here è la patch per il sistema di generazione Chromium che implementa la risoluzione.

dettagli
Il PPB utilizza un filesystem virtuale internamente: MSF. Quando il linker crea il file PDB, il suo valore predefinito è una dimensione della pagina di 2 kB (apparentemente non configurabile). Apparentemente & fortunatamente quando il compilatore crea il suo PDB imposta di default la dimensione della pagina a 4 kB. Questo PDB del compilatore può essere issato e utilizzato come base per il PDB del linker.

migliore soluzione Come pre-Link Event sul progetto che è il collegamento il vostro exe o dll possiamo issare il compilatore a generare la nostra richiesta PPB iniziale:

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

soluzione originale
Creare un progetto di libreria statica C++ con un file cpp vuoto, configurare il 'Nome file database Porgram' per produrre qualcosa di diverso da quello predefinito. Utilizzare alcuni eventi di sviluppo del progetto (io ho usato "Evento pre-link") per copiare nel PDB creato in precedenza nel luogo in cui il linker si aspetta (vedi Linker-> Genera file di database del programma) per creare il suo PDB. Fortunatamente il linker adotterà il copiato in PDB e utilizzerà la sua dimensione di pagina di 4 kB. Questo comprerà un po 'di tempo, e un po' di spazio che consente fino a un PDB da 2 GB.

+0

I build incrementali erano noti per causare tali problemi. Sta succedendo durante una ricostruzione completa dopo una pulizia? –

+0

Sì, sta succedendo su build & rebuild. Credo che il collegamento incrementale sia disattivato, ma stiamo verificando due volte. – Zac

risposta

6

Esiste un limite massimo di 1GB per le dimensioni del pdb. C'è qualche trucco per estendere questo a 2GB (maggiori informazioni a riguardo possono essere trovate Here). Fondamentalmente devi generare il file pdb iniziale al posto del compilatore.

Altre cose che si possono fare è fare un sollevamento attivo sul codice del modello in quanto ciò potrebbe influenzare anche le dimensioni del pdb.

+0

Collegamento al relativo changeset in cromo: https://chromium.googlesource.com/experimental/external/gyp/+/9ee1e40e50f3148f691965a0829709f0d25b0412 –

0

Si è tentato di ridurre il numero di build parallele. Un'ambientazione da qualche parte nell'IDE. Su VC9 abbiamo avuto un problema simile e la nostra unica soluzione era ridurre il numero di build locali. Potrebbe anche esserci un problema di memoria? Stai usando VC 10 SP1?

+0

Tutto è soddisfacente, quindi non sono sicuro del motivo per cui la compilazione/MP avrà un impatto. Siamo preoccupati che il linker non abbia memoria, è una versione a 32 bit (linker.exe a 32 bit). Stiamo usando SP1. – Zac

5

Ho creato un programma di test con 1000 file cpp, ciascuno cpp con una funzione, che ha istanziato 500 tipi di modelli univoci.

Link.exe non riuscito quando il file PDB ha raggiunto: 1048575 KB.

Sembra essere una sorta di limite rigido a 1 GB nel formato PDB o in LINK.exe.