编译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++