Ho una cartella chiamata code/
, sotto questa cartella ho una cartella chiamata include/
e il file sorgente chiamato code.cc
, il include/
contiene i file di intestazione a.h
, b.h
e questi due file di intestazione esistono anche da qualche altra parte, al fine di utilizzare i file di intestazione nel file include/
cartella, ho aggiunto una bandiera -Iinclude
nel mio Makefile
, ma il mio codice usa ancora quei file di intestazione in altri posti, se includo i file di intestazione nel modo seguente, il mio codice usa i file di intestazione sotto include/
, perché non è il -I
il flag cambia la directory include?
#include "include/a.h"
#include "include/b.h"
modificare: Directory:
code/code.cc
code/Makefile
code/include/a.h
code/include/b.h
Makefile:
CFLAGS = -Iinclude/
CFLAGS += -m32
LDFLAGS = -Llib -llits -lrt -lpthread -Wl,-R,"lib"
code:code.cc
gcc -o code $(CFLAGS) $(LDFLAGS) code.cc
gcc --version:
gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
risposte:
1 per risposta № 1Con questa configurazione:
code/code.cc
code/Makefile
code/include/a.h
code/include/b.h
E aggiungendo -Iinclude/
alle bandiere del compilatore, il tuo #include "include/a.h"
cercherei include/a.h
nel include/
cartella prima. Ad esempio, il compilatore cerca include/include/a.h
che non esiste, e il compilatore cerca il include/a.h
file altrove nel percorso di ricerca.
Il tuo codice deve essere utilizzato #include "a.h"
o il tuo -Iinclude/
dovrebbe essere -I.
-IO. aggiunge la directory corrente al percorso di ricerca, ad esempio #include "include/a.h"
corrisponderebbe al file ./include/a.h
Assicurarsi -I.
viene aggiunto prima di qualsiasi altro percorso di ricerca che potrebbe anche corrispondere ai file inclusi.
0 per risposta № 2
L'ordine di -I
direttive a gcc
è importante. Il -I
la direttiva che aggiunge "quei file di intestazione in altri posti" deve venire prima -Iinclude
per /include
.
0 per risposta № 3
Devi usare
CFLAGS = -I<full_path_to_project>/code
Se include
è collocato sotto questa directory e tu includi file relativi ad esso come nella tua dichiarazione di inclusione
#include "include/a.h"
// ^^^^^^^^^
Se si specifica
CFLAGS = -I<full_path_to_project>/code/include
Non è necessario specificare percorsi di inclusione relativi
#include "a.h"
Percorsi relativi specificati con -I
inizierà con la directory di lavoro utilizzata da make
. Se non c'è una parte relativa del percorso da lì, si omette il -I
opzione, o specificare -I./
.