2008-09-17 10 views
19

Beim Lernen von Tinyos habe ich entdeckt, dass ich Makefiles total ahnungslos finde.Makefiles CFLAGS

Es gibt viele optionale Kompilierzeitfunktionen, die zur Deklaration von Präprozessorvariablen verwendet werden können.

sie nutzen zu können, Dinge zu tun haben, wie:

CFLAGS="-DPACKET_LINK" diese eine bestimmte Funktion ermöglicht.

und

CFLAGS="-DPACKET_LINK" "-DLOW_POWER" ermöglicht zwei Funktionen.

Kann jemand diese Zeilen für mich sezieren und mir sagen, was los ist? Nicht in Bezug auf Tinyos, sondern in Bezug auf Makefiles!

Antwort

7

Irgendwo in der Make-Datei die CFLAG wird in Kompilation Zeile wie folgt verwendet werden:
$(CC) $(CFLAGS) $(C_INCLUDES) $<

und schließlich in der Ausführung wird zu übersetzen:

gcc -DPACKET_LINK -DLOW_POWER -c filename.c -o filename.o

wird diese definieren weitergegeben zum Quellcode, wie er in der Header-Datei definiert wurde

19

CFLAGS ist eine Variable, die am häufigsten zum Hinzufügen von Argume verwendet wird nts zum Compiler. In diesem Fall definiert es Makros.

So ist die -DPACKET_LINK ist das Äquivalent #define PACKET_LINK 1 an der Spitze aller .c und .h-Dateien in Ihrem Projekt zu stellen. Höchstwahrscheinlich haben Sie Code in Ihrem Projekt, das, wenn dieser Makros sieht definiert und tut etwas auf, dass abhängig:

#ifdef PACKET_LINK 
// This code will be ignored if PACKET_LINK is not defined 
do_packet_link_stuff(); 
#endif 

#ifdef LOW_POWER 
// This code will be ignored if LOW_POWER is not defined  
handle_powersaving_functions(); 
#endif 

Wenn Sie weiter in Ihrer Make-Datei nach unten schauen, sollten Sie sehen, dass $(CFLAGS) wahrscheinlich wie verwendet wird:

$(CC) $(CFLAGS) ...some-more-arguments... 
+5

'-DPACKET_LINK' entspricht' #define PACKET_LINK 1 '. Wenn du '#define PACKET_LINK' willst, dann solltest du '-DAPACKET_LINK =' – Simon

+0

verwenden, das ich mit gcc docs überprüft habe und du bist @Simon korrekt. Aktualisiert meine Antwort –

1

D steht für definieren (in gcc) zumindest, die Sie anstelle einer Datei irgendwo #define auf der Kommandozeile lässt. Eine gemeinsame Sache zu sehen wäre -DDEBUG oder -DDNDEBUG, die jeweils Debugging-Code aktivieren oder deaktivieren.

2

Die Option -D setzt Vorprozessorvariablen, daher wird in Ihrem Fall der gesamte Code, der in den angegebenen "#ifdef/#endif" -Blöcken enthalten ist, kompiliert.

I.e.

#ifdef PACKET_LINK 
/* whatever code here */ 
#endif 

die CFLAGS- ist eine Variable in der Make-Datei verwendet, die es erweitert wird seinen Inhalt, wenn die Compiler aufgerufen wird.

z.

gcc $(CFLAGS) source.c 
1

Nur der Vollständigkeit halber in dieser - wenn Sie mit Microsofts Nmake Dienstprogramm, können Sie nicht wirklich sehen, die $ (CFLAGS) Makro in der Make-Datei verwendet, weil Nmake einige Voreinstellungen für Dinge hat wie die Erstellung von C/C++ Dateien .Unter anderem (ich bin nicht sicher, ob GNU etwas macht wie diese) die folgenden sind vordefiniert in nmake, so dass Sie es nicht in einem Arbeits Make-Datei unter Windows sehen könnte:

.c.exe: 
    commands:   $(CC) $(CFLAGS) $< 

.c.obj: 
    commands:   $(CC) $(CFLAGS) /c $< 

.cpp.exe: 
    commands:   $(CXX) $(CXXFLAGS) $< 

.cpp.obj: 
    commands:   $(CXX) $(CXXFLAGS) /c $<