CFLAGS,CXXFLAGS与CPPFLAGS的区别

太长不看版:  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++

你可能感兴趣的:(编译)