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。 由于在编译器调用中使用了CPPFLAGS
和CFLAGS
因此用于定义包含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 ++隐式规则也使用CPPFLAGS
variables。
这种差异为您提供了一个很好的指导 – 如果您希望将所有语言的标志用于CPPFLAGS
,如果是特定的语言,则将其放入CFLAGS
, CXXFLAGS
等中。后一种types的示例包括标准符合或警告标志 – 你不想传递-std=c99
到你的C ++编译器!
你可能会在makefile中得到这样的结果
CPPFLAGS=-I/usr/include CFLAGS=-std=c99 CXXFLAGS=-Weffc++
CPPFLAGS
macros是用来指定#include
目录的macros。
由于make
(1)规则将一个命令中的预处理和编译结合起来(所以在命令中使用了这两个macros), CPPFLAGS
和CFLAGS
工作。
你不需要指定.
作为一个包含目录,如果你使用的forms#include "..."
。 您也不需要指定标准的编译器包含目录。 你确实需要指定所有其他的include目录。
你在隐式制定规则之后 。