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

但是我仍然不明白区别。

我需要为#include包含的头文件指定一个include路径-因为#include是预处理指令,我唯一关心的是预处理程序(CPPFLAGS)吗?

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

通常,如果预处理程序找到并包含所需的头文件,为什么还需要告知它额外的包含目录? CFLAGS到底有什么用?

(就我而言,我实际上发现都允许我编译程序,这加剧了困惑……我可以使用CFLAGS CPPFLAGS来实现我的目标(至少在autoconf上下文中)。给?)

最佳答案

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

%.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++

10-08 19:52