Ответ 1
Неявное правило make для компиляции программы C
%.o:%.c
$(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $<
где синтаксис $()
расширяет переменные. Поскольку в вызове компилятора используются как CPPFLAGS
, так и CFLAGS
, которые вы используете для определения include paths, это вопрос личного вкуса. Например, если 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
Разница между двумя вступает в игру, когда у вас есть несколько языков, которым нужен один и тот же путь include, например, если у вас есть 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
поскольку неявное правило С++ также использует переменную CPPFLAGS
.
Это различие дает вам хорошее руководство для использования - если вы хотите, чтобы флаг использовался для всех языков, поместите его в CPPFLAGS
, если он для определенного языка поместил его в CFLAGS
, CXXFLAGS
и т.д. Примеры последнего типа включают стандартные флаги соответствия или предупреждения - вы не хотели бы передавать -std=c99
вашему компилятору С++!
В конечном итоге вы можете сделать что-то подобное в своем файле makefile
CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++