2014-11-04 9 views
6

Il mio codice usa libcxx, sdl e alcune altre librerie per tutto il tempo. Come posso generare .pch tenendo conto che ogni intestazione può includere altre intestazioni (anche con condizioni complesse come #ifdef #include #endif. Ecco perché è difficile capire l'elenco dei file di intestazione necessari. Devo usare solo tutti i file di intestazione trovati in quelle cartelle per creare .pch? Che ne è dell'uso di tali prestazioni .pch in quel caso?Come generare .pch per molte intestazioni?

AGGIORNAMENTO: se è importante lo uso con Clang (non GCC) e per essere più specifico tramite Clang C API pch

ho creato per singolo file di intestazione::. UPDATE2

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h -emit-pch -o header.pch 
MBA-Anton:pch asmirnov$ clang++ -include-pch header.pch source.cpp -o source -x c++ 

ma Non ero in grado di generare pch per più file:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h header2.h -emit-pch -o headers.pch 
clang: error: cannot specify -o when generating multiple output files 
+0

Penso di aver letto da qualche parte che l'STL di gcc è in qualche modo precompilato. Qualcuno può confermarlo? – alfC

risposta

1

In primo luogo, non ho usato pch con gcc solo con il compilatore Microsoft.

Le condizioni di #ifdef ecc. Vengono risolte prima della compilazione, quindi se si modifica una variabile del preprocessore, il file PCH viene comunque compilato. Quindi basta aggiungere tutti i file dalla lib di cui hai bisogno.

In generale, includere tutte le intestazioni che non è probabile che cambino spesso (cioè libs esterne e parti del sistema stabili).

Non preoccuparti troppo di includere le intestazioni più volte nel file pch. Dato che questo file non verrà compilato molto spesso qui puoi ignorare tempi di compilazione elevati.

Ciò che non sono sicuro è se le dimensioni del file esagerato diventano più grandi quando si include tutto nel file pch. Questo potrebbe essere il caso perché si fa riferimento a parti di codice altrimenti non utilizzate che vengono compilate nel file eseguibile solo perché sono state aggiunte al file pch. Si potrebbe voler verificare questo.

Ora, dalla mia esperienza, un'altra domanda importante è se le prestazioni della compilazione sono lente durante la compilazione o durante il collegamento.

Quando si hanno tempi di collegamento elevato, è più probabile che il problema includa troppe intestazioni nelle intestazioni nel codice.

Questo può essere ottimizzato utilizzando le dichiarazioni di inoltro nei file di intestazione e includendo solo le intestazioni nei file .cpp. Avevamo enormi progetti monolitici e ogni volta il maggiore incremento delle prestazioni per la compilazione/il collegamento era rimuovendo le dipendenze dell'intestazione inoltrandole il più possibile.

Questo perché la compilazione incrementale funziona molto bene ma il collegamento incrementale no.

Ecco una breve ma buono compilazioni del fare e non fare per quanto riguarda l'ora di dichiarazione: http://www.chromium.org/developers/coding-style/cpp-dos-and-donts

+0

l'obiettivo principale dell'utilizzo di .pch nel mio caso se ridurre il tempo di compilazione/collegamento come elenco di intestazioni è sempre lo stesso. Non mi preoccupo di includere alcune intestazioni più volte, ma mi preoccupo di aggiungere intestazioni non necessarie nel file pch. Questa è la domanda. – 4ntoine

2

Il GCC compilatore funziona bene solo con un unico incluso intestazione precompilata, as explained in this answer.Quindi, se si desidera utilizzare PCH nel GCC, è necessario avere un unico file di intestazione per tutte le unità di traduzione delle applicazioni (e ciascuno di essi dovrebbe iniziare con esattamente che singolo#include direttiva)

I Immagino che una tale situazione sia utile anche per altri compilatori che supportano alcune intestazioni precompilate.

Le versioni future (post C++14) dello standard C++ potrebbero definire un meccanismo di modulo. Vedi per es. n4047 proposta.

Si noti che le intestazioni precompilate sono molto specifiche del compilatore (con GCC, potrebbero non funzionare nemmeno quando si esegue l'ugrading da GCC 4.9.1 a GCC 4.9.2), quindi non si dovrebbe dipendere troppo da esse.

+0

grazie per informazioni su gcc. in realtà ho dovuto aggiungere che ne ho bisogno per il clang ma non lo sapevo importa – 4ntoine

+0

come ho letto qui (http://clang.llvm.org/docs/PCHInternals.html) i pch di clang vengono solitamente generati per un fascio di intestazioni . – 4ntoine

Problemi correlati