CFLAGS vs CPPFLAGS
我知道CFLAGS(或C ++的CXXFLAGS)用于编译器,而CPPFLAGS由预处理器使用。
但是我仍然不明白区别。
我需要为#include包含的头文件指定一个include路径-因为#include是预处理器指令,所以预处理器(CPPFLAGS)是我唯一关心的吗?
在什么情况下需要给编译器额外的包含路径?
通常,如果预处理程序找到并包含所需的头文件,为什么还需要告知它额外的包含目录? CFLAGS到底有什么用?
(就我而言,我实际上发现这两者都允许我编译程序,这增加了混乱……我可以使用CFLAGS或CPPFLAGS来实现我的目标(至少在autoconf上下文中。这有什么用?)
编译C程序的隐式make规则是
1 2 | %.o:%.c $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $< |
1 2 | make foo.o CPPFLAGS="-I/usr/include" make foo.o CFLAGS="-I/usr/include" |
都将以完全相同的方式调用编译器,即
1 | gcc -I/usr/include -c -o foo.o foo.c |
当您使用多种语言需要相同的包含路径时,这两者之间的区别就会发挥作用,例如,如果您使用
1 2 | make bar.o CPPFLAGS="-I/usr/include" make bar.o CFLAGS="-I/usr/include" |
那么汇编将是
1 2 | g++ -I/usr/include -c -o bar.o bar.cpp g++ -c -o bar.o bar.cpp |
因为C ++隐式规则也使用
这种差异为您提供了一个很好的使用指南-如果您希望将标志用于所有语言,请将其放在
然后,您可能会在makefile中得到类似这样的结果
1 2 3 | CPPFLAGS=-I/usr/include CFLAGS=-std=c99 CXXFLAGS=-Weffc++ |
如果使用格式
您遵循隐式make规则。