сделать файлы CFLAGS

#makefile

Вопрос:

В процессе изучения tinyos я обнаружил, что совершенно не разбираюсь в файлах makefile.

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

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

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

и

CFLAGS="-DPACKET_LINK" "-DLOW_POWER" включает две функции.

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

Ответ №1:

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

Таким -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...
 

Комментарии:

1. -DPACKET_LINK эквивалентно #define PACKET_LINK 1 . Если вы хотите #define PACKET_LINK , то вам следует использовать -DPACKET_LINK=

2. Я проверил документы gcc, и вы правы @Simon. Обновил свой ответ

Ответ №2:

Где-то в файле makefile CFLAG будет использоваться в строке компиляции следующим образом:
$(CC) $(CFLAGS) $(C_INCLUDES) $<

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

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

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

Ответ №3:

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

Т.е.

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

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

Напр.

 gcc $(CFLAGS) source.c
 

Ответ №4:

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

Ответ №5:

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

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

lt;

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


lt;

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


lt;

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


lt;