#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;