Я понимаю, что CFLAGS (или CXXFLAGS для C ++) предназначены для компилятора, тогда как CPPFLAGS используется препроцессором.
Но я до сих пор не понимаю разницы.
Мне нужно указать путь включения для файла заголовка, который включается с помощью #include - поскольку #include - это директива препроцессора, препроцессор (CPPFLAGS) - единственное, что меня волнует?
При каких обстоятельствах мне нужно предоставить компилятору дополнительный путь включения?
В общем, если препроцессор находит и включает необходимые файлы заголовков, зачем ему когда-либо сообщать о дополнительных подключаемых каталогах? Какая вообще польза от CFLAGS?
(В моем случае я действительно обнаружил, что ОБА из них позволяют мне компилировать мою программу, что добавляет путаницы ... Я могу использовать CFLAGS ИЛИ CPPFLAGS для достижения моей цели (по крайней мере, в контексте autoconf). Что дает?)
Ответы:
Неявное правило make для компиляции программы на C:
где
$()
синтаксис расширяет переменные. Поскольку обаCPPFLAGS
иCFLAGS
используются в вызове компилятора, который вы используете для определения путей включения, это дело личного вкуса. Например, еслиfoo.c
это файл в текущем каталогеоба будут вызывать ваш компилятор точно так же, а именно
Разница между ними проявляется, когда у вас есть несколько языков, которым нужен один и тот же путь включения, например, если вы
bar.cpp
попробуететогда сборники будут
поскольку неявное правило C ++ также использует
CPPFLAGS
переменную.Эта разница дает хорошее руководство , для которого нужно использовать - если вы хотите, чтобы флаг будет использоваться для всех языков положить его в
CPPFLAGS
, если это для конкретного языка положить его вCFLAGS
, иCXXFLAGS
т.д. Примерами последнего типа включают в себя стандартные соответствия или предупреждающие флаги - вы бы не хотели переходить-std=c99
на свой компилятор C ++!Затем вы можете получить что-то подобное в своем make-файле
источник
cpp
использованиеCPPFLAGS
и ожидать какого-либо разумного результата, поскольку-std=c99
влияет на то, какие символы определены (особенно вместо макросов тестирования функций). Вместо этого вам нужно$(CC) $(CPPFLAGS) $(CFLAGS) -E
.CPPFLAGS
Макрос является один использовать для указания#include
каталогов.Оба
CPPFLAGS
иCFLAGS
работают в вашем случае, потому чтоmake
правило (1) объединяет предварительную обработку и компиляцию в одной команде (поэтому в команде используются оба макроса).Вам не нужно указывать
.
в качестве включаемого каталога, если вы используете форму#include "..."
. Вам также не нужно указывать стандартный каталог include компилятора. Вам необходимо указать все остальные подключаемые каталоги.источник
gcc -E
файл - нет #includes). Большинство современных компиляторов объединяют этапы предварительной обработки и компиляции, поэтому вам не нужно об этом беспокоиться.Вам нужны неявные правила make .
источник
Чтобы добавить к тем, кто упомянул неявные правила, лучше всего посмотреть, что make определил неявно и для вашего env, используя:
Например:
который расширяет
Это также распечатает
# environment
данные. Здесь вы найдете путь включения GCC среди другой полезной информации.В make, когда дело доходит до поиска, путей много, свет один ... или что-то в этом роде.
C_INCLUDE_PATH
общесистемный, установите его в оболочке*.rc
.$(CPPFLAGS)
это путь включения препроцессора.... или даже более конкретно
make использует VPATH как общий путь поиска, поэтому используйте его с осторожностью. Если файл существует более чем в одном месте, указанном в VPATH, make возьмет первое вхождение в списке.
источник