Domanda

Per la maggior parte del mio lavoro di sviluppo con Visual C ++, sto usando costruisce parziali, per esempio premere F7 e modificati solo i file C ++ e le loro dipendenze ottenere ricostruito, seguito da un collegamento incrementale. Prima di passare una versione di prova su, prendo la precauzione di fare una ricostruzione completa, che dura circa 45 minuti sul mio progetto in corso. Ho visto molti post e articoli che sostengono questa azione, a meno di chiedersi è necessario, e se sì, perché? Influisce l'EXE consegnato o PPB associato (che usiamo anche in fase di test)? Sarebbe la funzione software diverso da un punto di vista di prova?

Per build di rilascio, sto usando VS2005, compilazione incrementale e il collegamento, intestazioni precompilate.

È stato utile?

Soluzione

Non ha tutti venire attraverso questo modello di utilizzo? Ottengo errori di generazione strani, e prima ancora indagando faccio una ricostruzione completa, e il problema va via.

Questo di per sé mi sembra essere ragione sufficiente per fare una ricostruzione completa prima di un rilascio.

Sia che sarebbe disposto a trasformare una generazione incrementale che completa senza problemi oltre ai test, è una questione di gusto, credo.

Altri suggerimenti

Il sistema di compilazione parziale funziona controllando date di file su file di origine contro i risultati di build. Così può rompersi se per esempio ripristinare un file precedente dal controllo di origine. Il file in precedenza avrebbe una data modificata prima di quanto il prodotto di compilazione, in modo che il prodotto non sarebbe stato ricostruito. Per proteggersi da questi errori, si dovrebbe fare una build completa se si tratta di una build finale. Mentre si sta sviluppando però, incrementale generazioni sono, naturalmente, molto più efficiente.

Modifica:. E, naturalmente, facendo una ricostruzione completa ti protegge anche da eventuali bug nel sistema di compilazione incrementale

Il problema di fondo è che la compilazione dipende l'ambiente (flag della riga di comando, librerie disponibili, e probabilmente un po 'di magia nera), e così due compilation avrà solo lo stesso risultato se vengono eseguite nelle stesse condizioni. Per il test e la distribuzione, si vuole fare in modo che gli ambienti sono così controllati possibile e non si è trovato comportamenti strambi a causa di codice di strano. Un buon esempio è se si aggiorna una libreria di sistema, quindi ricompilare la metà dei file - la metà stanno ancora cercando di utilizzare il vecchio codice, la metà non lo sono. In un mondo perfetto, questo sarebbe uno errore fuori subito o non causa alcun problema, ma purtroppo, a volte nessuna di queste accadere. Come risultato, facendo una ricompilazione completa evita un sacco di problemi associati a un processo di generazione scaglionato.

Lo consiglio esso. Ho visto in diverse occasioni con una soluzione grande di Visual C ++ il correttore di dipendenza riescono a raccogliere qualche dipendere il codice modificato. Quando questo cambiamento è quello di un file di intestazione che effettua la dimensione di un oggetto cose molto strane può iniziare ad accadere. Sono sicuro che il correttore di dipendenza ha trovato meglio in VS 2008, ma ancora non mi fiderei per una build di rilascio.

Il più grande motivo di non spedire un binario in modo incrementale collegato è che alcune ottimizzazioni sono disabilitati. Il linker lascerà imbottitura tra le funzioni (per rendere più facile per sostituire loro sul link seguente incrementale). Questo aggiunge un po 'di gonfiare al binario. Ci possono essere salti in più pure, che cambia il modello di accesso alla memoria e può causare il paging in più e / o di cache miss. Le vecchie versioni di funzioni possono continuare a risiedere nel file eseguibile, anche se non sono mai chiamati. Questo porta anche a gonfiare binario e rallentamento delle prestazioni. E non si può certo usare la generazione di codice di collegamento a tempo con collegamento incrementale, così si perde il più ottimizzazioni.

Se si sta dando una build di debug per un tester, allora probabilmente non è un grosso problema. Ma i vostri candidati di rilascio dovrebbe essere costruito da zero in modalità di rilascio, preferibilmente su una macchina di costruzione dedicata con un ambiente controllato.

Visual Studio ha alcuni problemi con parziale (incrementale) costruisce, (Io per lo più incontrato collega gli errori) di tanto in tanto, è molto utile avere una completa ricostruzione.

In caso di lunghi tempi di compilazione, ci sono due soluzioni:

  1. Utilizzare uno strumento di compilazione parallela e approfittare della vostra (presunto) hardware multicore.
  2. Usare una macchina build. Quello che uso di più è una macchina di costruzione separata, con un CruiseControl set up, che esegue ricostruzioni piene di tanto in tanto. Il rilascio "ufficiale" che fornisco al team di testing, e, infine, per il cliente, è sempre preso dalla macchina di costruzione, non dall'ambiente dello sviluppatore.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top