CFLAGS vs CPPFLAGS

我知道CFLAGS(或CXXFLAGS for C ++)是用于编译器的,而CPPFLAGS是由预处理器使用的。

但是我还是不明白其中的差别。

我需要为#include包含的头文件指定一个包含path,因为#include是一个预处理指令,是预处理器(CPPFLAGS),我唯一关心的是什么?

在什么情况下,我需要给编译器一个额外的包含path?

一般来说,如果预处理器find并包含所需的头文件,为什么需要被告知额外的包含目录呢? 什么是CFLAGS?

(在我的例子中,我发现这两个都允许我编译我的程序,这增加了混淆…我可以使用CFLAGS CPPFLAGS来实现我的目标(至less在autoconf中)。

编译C程序的隐含make规则是

%.o:%.c $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $< 

$()语法扩展variables。 由于在编译器调用中使用了CPPFLAGSCFLAGS因此用于定义包含path是个人喜好的事情。 例如,如果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 

当你有多种语言需要相同的包含path,例如,如果你有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 ++隐式规则也使用CPPFLAGSvariables。

这种差异为您提供了一个很好的指导 – 如果您希望将所有语言的标志用于CPPFLAGS ,如果是特定的语言,则将其放入CFLAGSCXXFLAGS等中。后一种types的示例包括标准符合或警告标志 – 你不想传递-std=c99到你的C ++编译器!

你可能会在makefile中得到这样的结果

 CPPFLAGS=-I/usr/include CFLAGS=-std=c99 CXXFLAGS=-Weffc++ 

CPPFLAGSmacros是用来指定#include目录的macros。

由于make (1)规则将一个命令中的预处理和编译结合起来(所以在命令中使用了这两个macros), CPPFLAGSCFLAGS工作。

你不需要指定. 作为一个包含目录,如果你使用的forms#include "..." 。 您也不需要指定标准的编译器包含目录。 你确实需要指定所有其他的include目录。

你在隐式制定规则之后 。