makefiles CFLAGS - PullRequest
       20

makefiles CFLAGS

20 голосов
/ 17 сентября 2008

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

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

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

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

и

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

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

Ответы [ 6 ]

22 голосов
/ 17 сентября 2008

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...
8 голосов
/ 17 сентября 2008

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

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

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

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

2 голосов
/ 17 сентября 2008

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

* 1003 Т.е. *

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

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

1008 * Е.Г. *

gcc $(CFLAGS) source.c
1 голос
/ 17 сентября 2008

Просто для полноты в этом - если вы используете утилиту 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 $<
1 голос
/ 17 сентября 2008

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

0 голосов
/ 06 октября 2008

Я обнаружил, что Ask Mr. Make является отличным справочником для советов по Makefile

http://www.cmcrossroads.com/content/category/8/147/268/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...