Ich verstehe, dass CFLAGS (oder CXXFLAGS für C ++) für den Compiler sind, während CPPFLAGS vom Präprozessor verwendet wird.
Aber ich verstehe den Unterschied immer noch nicht.
Ich muss einen Include-Pfad für eine Header-Datei angeben, die in #include enthalten ist. Ist #include eine Präprozessor-Direktive? Ist der Präprozessor (CPPFLAGS) das einzige, was mich interessiert?
Unter welchen Umständen muss ich dem Compiler einen zusätzlichen Include-Pfad geben?
Wenn der Präprozessor benötigte Header-Dateien findet und einschließt, warum muss er dann im Allgemeinen über zusätzliche Include-Verzeichnisse informiert werden? Was nützt CFLAGS überhaupt?
(In meinem Fall habe ich tatsächlich festgestellt, dass BEIDE davon es mir ermöglichen, mein Programm zu kompilieren, was die Verwirrung noch verstärkt ... Ich kann CFLAGS ODER CPPFLAGS verwenden, um mein Ziel zu erreichen (zumindest im Autoconf-Kontext). Was gibt es?)
Antworten:
Die implizite make-Regel zum Kompilieren eines C-Programms lautet
Dabei
$()
erweitert die Syntax die Variablen. Da beideCPPFLAGS
undCFLAGS
im Compiler-Aufruf verwendet werden, den Sie zum Definieren von Include-Pfaden verwenden, ist dies eine Frage des persönlichen Geschmacks. Zum Beispiel, wennfoo.c
sich eine Datei im aktuellen Verzeichnis befindetbeide rufen Ihren Compiler genauso auf, nämlich
Der Unterschied zwischen den beiden kommt ins Spiel, wenn Sie mehrere Sprachen haben, die denselben Include-Pfad benötigen, beispielsweise wenn Sie es
bar.cpp
dann versucht habendann werden die Zusammenstellungen sein
als implizite C ++ - Regel wird auch die
CPPFLAGS
Variable verwendet.Dieser Unterschied bietet Ihnen eine gute Anleitung für die Verwendung - wenn Sie möchten, dass das Flag für alle Sprachen verwendet wird, setzen Sie es ein
CPPFLAGS
, wenn es für eine bestimmte Sprache verwendetCFLAGS
wirdCXXFLAGS
usw. Beispiele für den letzteren Typ sind Standard-Konformitäts- oder Warnflags - Sie möchten nicht-std=c99
an Ihren C ++ - Compiler übergeben!Sie könnten dann so etwas in Ihrem Makefile haben
quelle
cpp
mitCPPFLAGS
jedem vernünftigen Ergebnis und erwarten , weil-std=c99
beeinflusst , welche Symbole (insbesondere anstelle von Feature - Test - Makros) definiert sind. Stattdessen brauchen Sie$(CC) $(CPPFLAGS) $(CFLAGS) -E
.Das
CPPFLAGS
Makro ist dasjenige, mit dem#include
Verzeichnisse angegeben werden.Beides
CPPFLAGS
undCFLAGS
funktionieren in Ihrem Fall, da diemake
(1) -Regel sowohl die Vorverarbeitung als auch das Kompilieren in einem Befehl kombiniert (daher werden beide Makros im Befehl verwendet).Sie müssen kein
.
Include-Verzeichnis angeben, wenn Sie das Formular verwenden#include "..."
. Sie müssen auch nicht das Standard-Compiler-Include-Verzeichnis angeben. Sie müssen alle anderen Include-Verzeichnisse angeben.quelle
gcc -E
eine Datei ausführen - es gibt keine #includes). Die meisten modernen Compiler kombinieren die Vorverarbeitungs- und Kompilierungsschritte, sodass Sie sich darüber keine Gedanken machen müssen.Sie sind nach impliziten Make-Regeln .
quelle
Um denjenigen hinzuzufügen, die die impliziten Regeln erwähnt haben, ist es am besten zu sehen, welche Marke implizit und für Ihre Umgebung definiert hat, indem Sie Folgendes verwenden:
Zum Beispiel:
was sich ausdehnt
Dadurch werden auch
# environment
Daten gedruckt . Hier finden Sie unter anderem den Include-Pfad des GCC.Wenn es um die Suche geht, gibt es viele Wege, das Licht ist einer ... oder etwas in diesem Sinne.
C_INCLUDE_PATH
ist systemweit, setzen Sie es in Ihre Shell*.rc
.$(CPPFLAGS)
ist für den Präprozessor-Include-Pfad.... oder noch genauer
make verwendet VPATH als allgemeinen Suchpfad. Gehen Sie daher vorsichtig vor. Wenn eine Datei an mehr als einem in VPATH aufgelisteten Speicherort vorhanden ist, wird make zum ersten Mal in der Liste aufgeführt.
quelle