Неявное правило 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++