Подтвердить что ты не робот

Makefiles CFLAGS

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

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

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

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

и

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

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

4b9b3361

Ответ 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

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

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

Ответ 2

Где-то в make файле 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 - это переменная, используемая в make файле, которая будет расширена до ее содержимого при вызове компилятора.

например.

gcc $(CFLAGS) source.c

Ответ 4

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

Ответ 5

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

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

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

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

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