2008-09-17 3 views
19

В процессе изучения tinyos я обнаружил, что я абсолютно не знаю о make-файлах.makefiles CFLAGS

Существует много дополнительных возможностей компиляции, которые могут быть использованы путем объявления переменных препроцессора.

Чтобы использовать их, вы должны делать такие вещи, как:

CFLAGS="-DPACKET_LINK" это дает определенную функцию.

и

CFLAGS="-DPACKET_LINK" "-DLOW_POWER" позволяет две функции.

Может кто-нибудь проанализировать эти строки для меня и рассказать мне, что происходит? Не в терминах tinyos, а в плане make-файлов!

ответ

7

Где-то в Makefile CFLAG будет использоваться в строку компиляции, как это:
$(CC) $(CFLAGS) $(C_INCLUDES) $<

и в конечном итоге в исполнении будет переведен на:

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

Это определение будет принят к исходному коду, как он определялся в файле заголовка

19

CFLAGS - это переменная, которая чаще всего используется для добавления argume nts компилятору. В этом случае он определяет макросы.

Таким образом, -DPACKET_LINK является эквивалентом размещения #define PACKET_LINK 1 в верхней части всех файлов .c и .h в вашем проекте. Скорее всего, у вас есть код внутри вашего проекта, который выглядит, если определены эти макросы и делает что-то в зависимости от того, что:

#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 

Если посмотреть дальше вниз в вашем Makefile, вы должны увидеть, что $(CFLAGS), вероятно, используется как:

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

`-DPACKET_LINK` эквивалентно` #define PACKET_LINK 1`. Если вы хотите `#define PACKET_LINK`, тогда вы должны использовать` -DPACKET_LINK = ` – Simon 2013-08-01 09:21:33

+0

Я проверил документы gcc и вы правильно @Simon. Обновлен мой ответ – 2013-08-07 09:55:36

1

-D обозначает определить (в GCC), по крайней мере, что позволяет #define в командной строке вместо файла где-нибудь. Обычным делом было бы -DDEBUG или -DNDEBUG, которые соответственно активируют или отключают код отладки.

2

Опция -D задает переменные препроцессора, поэтому в вашем случае будет скомпилирован весь код, который находится в указанных «#ifdef/#endif» блоках.

I.e.

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

The CFLAGS является переменной, используемой в Makefile, который будет расширен до его содержимое, когда компилятор вызывается.

E.g.

gcc $(CFLAGS) source.c 
1

Просто для полноты в этом - если вы используете утилиту NMake Microsoft, вы не могли бы реально увидеть $ (CFLAGS) макрос используется в Makefile, потому что NMAKE имеет некоторые значения по умолчанию для вещей, как компиляции C файлы/C++ ,Среди прочего, следующие предопределенные в NMAKE (я не уверен, если GNU Make делает что-нибудь подобное), так что вы не могли бы видеть его в рабочем Makefile в Windows:

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

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

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

.cpp.obj: 
    commands:   $(CXX) $(CXXFLAGS) /c $< 
Смежные вопросы