据我所知,CFLAGS(或CXXFLAGS用于C ++)是用于编译器,而CPPFLAGS用于由预处理器。
但我还是不明白的区别。
我需要指定一个包括附带的#include头文件路径 - 因为是#包括预处理器指令,是预处理器(CPPFLAGS)我关心的唯一事情?
在什么情况下,我需要给编译器一个额外的包含路径?
一般来说,如果预处理程序发现了和包括所需的头文件,为什么它永远需要被告知额外包括目录? 有什么用CFLAGS呢?
(在我的情况,我居然发现, 这两个让我编译我的程序,这增加了混乱......我可以使用CFLAGS CPPFLAGS OR来完成我的目标(在autoconf的情况下至少)。是什么给了?)
编译C程序中隐含的化妆规则
%.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++
该CPPFLAGS
宏是用来指定一个#include
目录。
无论CPPFLAGS
和CFLAGS
工作你的情况,因为make
(1)规则结合了预处理,并在一个命令编译(所以这两个宏在命令中使用)。
你并不需要指定.
作为一个包括目录,如果你使用形式#include "..."
。 你也不需要指定标准的编译器include目录。 你需要指定所有其他包括的目录。