太长不看版: CFLAGS,CXXFLAGS是针对某语言的,CPPFLAGS是全语言通用的
编译C程序的隐式make规则是
%.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 ++编译器! 然后,您可能会在makefile中得到类似的结果
CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++