Я понимаю, что CFLAGS (или CXXFLAGS для C++) для компилятора, тогда как CPPFLAGS используется препроцессором.
Но я все еще не понимаю различия.
Я должен указать включать путь для заголовочного файла, который включен с #include - потому что #include является директивой препроцессору, препроцессор (CPPFLAGS) единственная вещь, о которой я забочусь?
При каких обстоятельствах я должен дать компилятор, дополнительное включает путь?
В целом, если препроцессор находит и включает необходимые заголовочные файлы, почему он должен когда-либо говориться о дополнительном, включают каталоги? Какое использование является CFLAGS вообще?
(В моем случае я на самом деле нашел, что ОБА из них позволяют мне компилировать свою программу, которая добавляет к беспорядку... Я могу использовать CFLAGS ИЛИ CPPFLAGS для выполнения моей цели (в autoconf контексте, по крайней мере). Что дает?)
Неявное правило make для компиляции программы на C -
%.o:%.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
, где синтаксис $ ()
расширяет переменные. Поскольку в вызове компилятора используются как CPPFLAGS
, так и CFLAGS
, которые вы используете для определения путей включения, это дело личного вкуса. Например, если foo.c
- это файл в текущем каталоге, то
make foo.o CPPFLAGS="-I/usr/include"
make foo.o CFLAGS="-I/usr/include"
будут вызывать ваш компилятор точно так же, а именно
gcc -I/usr/include -c -o foo.o foo.c
. Разница между ними проявляется, когда у вас есть несколько языков. которым нужен тот же путь включения, например, если у вас есть bar.cpp
, попробуйте
make bar.o CPPFLAGS="-I/usr/include"
make bar.o CFLAGS="-I/usr/include"
, тогда компиляция будет
g++ -I/usr/include -c -o bar.o bar.cpp
g++ -c -o bar.o bar.cpp
, поскольку неявное правило C ++ также использует переменную CPPFLAGS
.
Это различие дает вам хорошее руководство по использованию - если вы хотите, чтобы флаг использовался для всех языков, поместите его в CPPFLAGS
, если он для определенного языка, поместите его в CFLAGS
, CXXFLAGS
и т. Д. Примеры последнего типа включают стандартные флаги соответствия или предупреждения - вы не захотите передавать -std = c99
вашему компилятору C ++!
В конечном итоге вы можете получить что-то подобное в своем make-файле
CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++
Макрос CPPFLAGS
используется для указания каталогов #include
.
Оба CPPFLAGS
и CFLAGS
работают в вашем случае, потому что правило make
(1) объединяет предварительную обработку и компиляцию в одной команде (поэтому используются оба макроса в команде).
Вам не нужно указывать .
как включаемый каталог, если вы используете форму #include "..."
. Вам также не нужно указывать стандартный каталог include компилятора. Вам необходимо указать все остальные подключаемые каталоги.