我知道CFLAGS(或C++的CXXFLAGS)用于编译器,而CPPFLAGS由预处理器使用。
但是我仍然不明白区别。
我需要为#include包含的头文件指定一个include路径-因为#include是预处理指令,我唯一关心的是预处理程序(CPPFLAGS)吗?
在什么情况下需要给编译器额外的包含路径?
通常,如果预处理程序找到并包含所需的头文件,为什么还需要告知它额外的包含目录? CFLAGS到底有什么用?
(就我而言,我实际上发现和都允许我编译程序,这加剧了困惑……我可以使用CFLAGS 或 CPPFLAGS来实现我的目标(至少在autoconf上下文中)。给?)
最佳答案
编译C程序的隐式make规则是
%.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++