Domanda

Ho una soluzione con molti progetti di Visual C++, il tutto utilizzando PCH, ma alcuni sono di particolare compilatore acceso per il progetto specifico.

La maggior parte di questi progetti condividono lo stesso set di intestazioni nei rispettivi stdafx.h (STL, boost, ecc).Mi chiedo se è possibile condividere PCH tra i progetti, in modo che invece di compilare ogni PCH a progetto potrei forse hanno in comune il PCH che la maggior parte dei progetti nella soluzione potrebbe utilizzare.

Sembra possibile specificare la posizione del PCH come un percorso condiviso le impostazioni di progetto, così ho il presentimento che questo potrebbe funzionare.Sto anche assumendo che tutti i file di origine in tutti i progetti che condivide il PCH dovrebbe avere lo stesso compilatore impostazioni, altrimenti il compilatore si lamentano per incongruenze tra il PCH e il file di origine in fase di compilazione.

Qualcuno ha provato questo?Funziona?

Una domanda correlata:tale shard PCH essere eccessivamente inclusive, o sarebbe male complessiva del tempo di costruzione?Per esempio, un comune di PCH potrebbe includere molti STL intestazioni che sono ampiamente utilizzati, ma alcuni projecst potrebbe solo bisogno di <string> e <vector>.Sarebbe il tempo risparmiato utilizzando un comune PCH devono essere pagati indietro a un punto successivo del processo di costruzione, quando l'ottimizzatore sarebbe necessario eliminare tutte le inutilizzati roba trascinato nel progetto dal PCH?

È stato utile?

Soluzione

Sì è possibile e vi posso assicurare che il risparmio di tempo è notevole.Quando si compila il PCH, devi copiare il .pdb e .idb i file da un progetto che si sta creando il file PCH.Nel mio caso, ho un semplice due file di progetto è la creazione di un file PCH.L'intestazione sarà il PCH intestazione e la sorgente viene detto di creare il PCH con le impostazioni di progetto - questo è simile a quello che si farebbe normalmente in qualsiasi progetto.Come hai detto, devi avere le stesse impostazioni di compilazione per ogni configurazione, in caso contrario una discrepanza derivano e il compilatore si lamenta.

Copiare i file di cui sopra, ogni volta che c'è una ricostruzione o ogni volta che il PCH è ricompilato sta andando essere un dolore, così possiamo automatizzare.Per automatizzare la copia, eseguire una pre-build caso in cui il file di cui sopra vengono copiati nella directory appropriata.Per esempio, se si esegue la compilazione Debug e Release build del tuo PCH, copiare i file dalla Debug di il PCH progetto, oltre al vostro dipendente del progetto Debug.Così un comando di copia sarebbe simile a questa

copia PchPath\Debug*.pdb Debug\ /-Y

Nota il /-Y alla fine.Dopo la prima generazione, ogni successiva generazione è compilato in modo incrementale, quindi se si sostituisce il file di nuovo, Visual Studio si lamenta danneggiato simboli.Se danneggiato, si può sempre eseguire una ricostruzione, in cui verranno copiati i file di nuovo (questa volta non ignorare, come non esistono più - la pulizia elimina i file).

Spero che questo aiuta.Mi ci è voluto un bel po ' di tempo per essere in grado di fare questo, ma ne è valsa la pena.Ho diversi progetti che dipendono da un unico grande quadro, e il PCH deve essere compilata una sola volta.Tutti i progetti dipendenti compilare ora molto rapidamente.

EDIT:Insieme con molte altre persone, ho testato questo in VS2010 e VS2012 e sembra funzionare correttamente.

Altri suggerimenti

Mentre questa è una domanda che mi vuole dare una nuova risposta, che funziona in Visual Studio 2017 e non comporta alcuna copia.Unico svantaggio:Modifica e continua a non funzionare più.

Fondamentalmente, è necessario creare un nuovo progetto per l'intestazione precompilata e hanno tutti gli altri progetto dipendono da esso.Ecco cosa ho fatto:

Step by Step:

  1. Creare un nuovo progetto withnin la tua soluzione, che include l'intestazione (chiamato pch.h di seguito) e una linea cpp file che include pch.h.Il progetto dovrebbe creare una statico lib.L'installazione del nuovo progetto per creare un'intestazione precompilata.Il file di output deve essere accessibile da tutti i progetti.per me questa rispetto alla IntDir, ma per le impostazioni di default potrebbe essere relativo a $(SolutionDir).Il pch progetto deve solo avere definisce tutti gli altri progetti sono troppo.

    pch project settings

  2. Hanno tutti gli altri progetti che dipendono da questo nuovo progetto.In caso contrario l'ordine di generazione potrebbe essere sbagliato.

    project references

  3. L'installazione di tutti gli altri progetti per l'impiego del pch.h.Vedere, come i parametri del file di output sono gli stessi come nel pch progetto.La directory di inclusione aggiuntive anche bisogno di scegliere il pch.h directory.Facoltativamente, è possibile forzare includere il file pch in ogni cpp (o includere manualmente nella prima riga di ogni file cpp).

    pch include include

    1. L'installazione di tutti i progetti (tra cui il pch progetto) per utilizzare lo stesso compilatore file di simboli (il linker simbolo file non è interessato).Di nuovo, nel mio esempio questo è OutDir ma la tua soluzione potrebbe variare.Ha a che puntano allo stesso file su disco.Le Informazioni di Debug Formato deve essere impostato a C7 (vedi screenshot sopra), altrimenti Visual Studio non sarà in grado di compilare i progetti in parallelo.pdb

Spero di non dimenticare nulla.Per la mia soluzione (130k loc, 160 progetti) questo cavo per un tempo di compilazione di ~2:30 minuti invece di ~3:30 minuti.

Sembra che non è possibile perché ogni file sorgente deve essere compilato contro la stessa PDB, contro il quale il PCH è stato compilato.accidenti.

Samaursa risposta lavorato per me.

Ho visto anche questo link che funziona (cercare Reginald risposta in prossimità del fondo).

Questo utilizza copy mentre Reginald usi xcopy (Io preferisco xcopy).In ogni modo, grazie--questo ha velocizzato il mio costruisce notevolmente.

Questo suona come un caso di "rendimenti decrescenti" per me.Supponiamo che tra i comuni direttamente le intestazioni dei rifiuti 1 secondo per .file cpp, e ogni destinazione (DLL/EXE) ha 10 .i file cpp.Utilizzando un .pch per destinazione, si salva 10 secondi per ogni destinazione.Se il progetto intero è di 10 obiettivi, si salva 1,5 minuti su tutta la build, che è buono.

Ma riducendola a uno .pch per l'intero progetto, si sarebbe solo di risparmiare un ulteriore 9 secondi.Ne vale la pena?Lo sforzo in più (che può essere molto più complicato da configurare, essendo un non-standard di configurazione non supportata da VS wizards), produce solo il 10 del risparmio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top