2012-09-29 10 views
26

Ho un progetto (una libreria) che è suddiviso in poche directory con il codice in esse. Mi piacerebbe avere g + + cercare i file di intestazione nella directory radice del progetto, così posso evitare diversi percorsi di inclusione per gli stessi file di intestazione su più file sorgente.Come eseguire la ricerca in g ++ per i file di intestazione in una directory specifica?

Principalmente, la directory root/ ha sotto-directory A/, B/ e C/, che hanno tutti .hpp e .cpp file all'interno. Se un file sorgente in A voleva includere file.hpp, che era in B, dovrebbe farlo in questo modo: #include "../B/file.hpp". Lo stesso vale per un altro file sorgente che si trovava in C. Ma, se A stesso avesse sottodirectory con file che avevano bisogno di file.hpp, allora sarebbe incoerente e causerebbe errori se decidessi di spostare i file (perché il percorso di inclusione sarebbe "../../B/file.hpp") .

Inoltre, questo dovrebbe funzionare anche da altri progetti, che risiedono al di fuori di root/. So già che esiste un'opzione per copiare manualmente tutti i miei file di intestazione in una directory di ricerca predefinita, ma mi piacerebbe farlo nel modo che ho descritto.

Modifica: tutti i programmi che utilizzano la libreria devono compilare solo con g++ prog.cpp lib.a -o prog. Ciò significa che permanentemente impostare il percorso di inclusione per g ++!

risposta

35

A/code.cpp

#include <B/file.hpp> 

A/a/code2.cpp

#include <B/file.hpp> 

compilazione utilizzando:

g++ -I /your/source/root /your/source/root/A/code.cpp 
g++ -I /your/source/root /your/source/root/A/a/code2.cpp 

Edit:

È possibile utilizzare l'ambiente variabili per cambiare il percorso g ++ cerca head er file. Dalla pagina man:

Alcune variabili di ambiente aggiuntive influiscono sul comportamento del preprocessore .

CPATH 
    C_INCLUDE_PATH 
    CPLUS_INCLUDE_PATH 
    OBJC_INCLUDE_PATH 

valore di ogni variabile è una lista di directory separate da un carattere speciale, molto simile a PATH, in cui cercare di intestazione file. Il carattere speciale "PATH_SEPARATOR" è dipendente dalla destinazione e determinato al momento della compilazione di GCC. Per gli obiettivi basati su Microsoft Windows, lo è un punto e virgola e per quasi tutti gli altri target è un punto due punti.

CPATH specifica un elenco di directory da cercare come se specificato con -I, ma dopo ogni percorso fornito con opzioni -I sulla riga di comando . Questa variabile di ambiente viene utilizzata indipendentemente da quale lingua viene sottoposta a pre-elaborazione.

Le restanti variabili di ambiente si applicano solo al momento della preelaborazione della lingua specifica indicata. Ognuno specifica un elenco di directory da cercare come se fosse specificato con -isystem, ma dopo ogni percorso fornito con le opzioni -isystem sulla riga di comando.

In tutte queste variabili, un elemento vuoto indica al compilatore di cercare la directory di lavoro corrente. Gli elementi vuoti possono apparire all'inizio o alla fine di un percorso. Ad esempio, se il valore di CPATH è ":/special/include", ha lo stesso effetto di -I. -I/speciale/include.

Esistono molti modi per modificare una variabile di ambiente. Su bash vengono richieste si può fare questo:

$ export CPATH=/your/source/root 
$ g++ /your/source/root/A/code.cpp 
$ g++ /your/source/root/A/a/code2.cpp 

Ovviamente si può aggiungere questo nel vostro Makefile ecc

+0

Ehi, ho affermato la domanda senza un dettaglio importante, vedi la modifica, grazie! – corazza

+0

@Bane, che cambia tutto :-). Ho modificato la mia risposta per includere più opzioni che possono essere utilizzate. – Vikas

+0

Sembra essere quello che sto cercando. Esattamente come posso modificarli? (Con un'istruzione CLI, ovvero, che devo aggiungere alla regola di installazione del makefile della mia libreria.) – corazza

0

intestazioni incluso con #include <> verrà cercato in tutte le directory di default, ma è anche possibile aggiungere la propria posizione nel percorso di ricerca con -I riga di comando arg.

ho visto la tua modifica è possibile installare le intestazioni in posizioni predefinite di solito

/usr/local/include 
libdir/gcc/target/version/include 
/usr/target/include 
/usr/include 

Confermare con docs compilatore però.

+0

Sì, lo so, ma per favore guarda la modifica. – corazza

+0

Ya vedi sopra l'installazione include nelle posizioni predefinite per una risoluzione veloce. – NiladriBose

12
gcc -I/path -L/path 
  • -I /path percorso per includere, gcc troverà .h file in questo percorso

  • -L /path contiene i file di libreria, .a, .s o

0

è semplice, utilizzare la Opzione "-B" per aggiungere la directory dei file .h al percorso di ricerca.

E.g. g ++ -B /header_file.h your.cpp -o bin/your_command

Problemi correlati