2010-07-02 7 views
12

Sto usando le intestazioni precompilate GCC nel mio progetto con build multi-architettura, ma le cose si guastano quando provo a collocarlo in una directory diversa dalla directory dell'origine corrente.Come rendere GCC la ricerca di intestazioni in una directory prima della directory del file sorgente corrente?

Il file è incluso tra virgolette doppie, e funziona se lo cambio in parentesi angolari, ma il problema è che ho molti altri progetti che usano lo stesso nome di intestazione precompilato, quindi cambiandoli tutti in angolo parentesi non è desiderabile in quanto potrebbe creare ambiguità su quale intestazione includere nella build di Visual Studio degli stessi file.

GCC searches current directory for double-quote includes before its search path. Posso aggirare il problema usando l'opzione -I- (ad esempio -Ipch_dir.i686 -I-), in modo che la directory delle intestazioni precompilate sia ricercata prima della directory corrente, ma questa opzione è deprecata. GCC suggerisce di utilizzare -iquote, ma non ha lo stesso effetto di -I-.

Quindi la domanda è: come faccio a farlo funzionare senza modificare tutte le intestazioni precompilate includendo le direttive tra parentesi angolari e utilizzando uno switch GCC deprecato?

+0

Cosa c'è che non va se si dispone di un set di intestazioni precompilate in un'unica posizione utilizzata in tutti i progetti? O rinominare la tua intestazione precompilata se deve essere unica per il tuo progetto? –

+0

@Owen S. Vorrei evitare di apportare modifiche sostanziali alla struttura del progetto/sistema di costruzione globale. –

risposta

10

Ho trovato una soluzione alternativa.

  1. Creare un'intestazione precompilata con un nome diverso. Per esempio è l'intestazione è a.h, intestazione precompilata originale è pchdir.i686/a.h.gch, costruirlo come

    gcc a.h -o pchdir.i686/a-precompiled.h.gch 
    
  2. interruttore
  3. Uso del GCC -include per assicurarsi che l'intestazione rinominato è incluso prima qualsiasi altra cosa (anche prima che l'originale a.h), per esempio

    gcc -Ipchdir.i686 -include a-precompiled.h <other arguments> <source> 
    
  4. finale ordine inclusione nel file sorgente sarà: a-precompiled.h.gch, a.h, che ho controllato con -H. L'intestazione originale è inclusa, ma non viene effettivamente elaborata perché l'intestazione precompilata ha guardie incluse identiche (verificate anche inserendo uno #error nell'intestazione originale dopo aver creato quello precompilato).

+1

+1 @alex nice, sto correndo in un problema simile in cui voglio che gcc cerchi il file pch in una directory diversa dalla posizione dell'intestazione. Darò la tua soluzione alternativa e spero che funzioni. Qualcosa che mi ha davvero irritato di gcc è perché non rendono la funzione pch più facile da usare? Trovo che il programmatore/utente troppo spesso deve giocherellare con le impostazioni dello strumento che in realtà non dovremmo preoccuparci. Voglio dire, dovrebbe semplicemente "funzionare". – greatwolf

+1

+1 @alex. Grazie per aver condiviso la soluzione, mi ha aiutato anche me. Voglio solo notare che è possibile semplificarlo in modo significativo: non è necessario rinominare l'output precompilato e aggiungere la sua cartella agli include. Dopo aver generato l'output precompilato nella cartella dipendente dalla configurazione, utilizzare -include con il suo percorso univoco, non solo il nome. Nel tuo caso: 'gcc -include pchdir.i686/a.h ...' è tutto ciò di cui hai bisogno. (funziona su os x clang) – zzz

Problemi correlati