CFLAGS CPPFLAGS VSCFLAGS CPPFLAGS VS(CFLAGS vs CPP

2019-05-12 17:39发布

据我所知,CFLAGS(或CXXFLAGS用于C ++)是用于编译器,而CPPFLAGS用于由预处理器。

但我还是不明白的区别。

我需要指定一个包括附带的#include头文件路径 - 因为是#包括预处理器指令,是预处理器(CPPFLAGS)我关心的唯一事情?

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

一般来说,如果预处理程序发现了和包括所需的头文件,为什么它永远需要被告知额外包括目录? 有什么用CFLAGS呢?

(在我的情况,我居然发现, 这两个让我编译我的程序,这增加了混乱......我可以使用CFLAGS CPPFLAGS OR来完成我的目标(在autoconf的情况下至少)。是什么给了?)

Answer 1:

编译C程序中隐含的化妆规则

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

其中$()语法扩展变量。 由于两个CPPFLAGSCFLAGS在编译器中调用,您可以使用它定义使用包括路径是个人喜好问题。 例如,如果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 ,如果它是一个特定的语言把它放在CFLAGSCXXFLAGS后一种类型的等等例子包括标准符合性或警告标志-你不会想通过-std=c99到你的C ++编译器!

那么你可能会最终在你的makefile是这样的

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


Answer 2:

CPPFLAGS宏是用来指定一个#include目录。

无论CPPFLAGSCFLAGS工作你的情况,因为make (1)规则结合了预处理,并在一个命令编译(所以这两个宏在命令中使用)。

你并不需要指定. 作为一个包括目录,如果你使用形式#include "..." 。 你也不需要指定标准的编译器include目录。 你需要指定所有其他包括的目录。



Answer 3:

您是后隐含make规则 。



文章来源: CFLAGS vs CPPFLAGS