Makefiles CFLAGS

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

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

Чтобы использовать их, вам нужно сделать что-то вроде:

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

и

CFLAGS = "-DPACKET_LINK" "-DLOW_POWER" поддерживает две функции.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
22
0
86 646
5

Ответы 5

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

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

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

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

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...

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

Simon 01.08.2013 13:21

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

Isak Savo 07.08.2013 13:55

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

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

Т.е.

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

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

Например.

gcc $(CFLAGS) source.c

Просто для полноты: если вы используете утилиту Microsoft nmake, вы можете не увидеть макрос $ (CFLAGS), используемый в make-файле, потому что nmake имеет некоторые значения по умолчанию для таких вещей, как компиляция файлов C / 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 $<

Другие вопросы по теме