我理解CFLAGS (或用于C++的CXXFLAGS )用于编译器,而CPPFLAGS则由预处理器使用。
但我还是不明白区别。
我需要为一个包含在#include中的头文件指定一个包含路径--因为#include是一个预处理指令,预处理器(CPPFLAGS)是我唯一关心的事情吗?
在什么情况下,我需要给编译器一个额外的包含路径?
通常,如果预处理程序找到并包含所需的头文件,为什么需要告诉它额外的包含目录?CFLAGS到底有什么用?
(在我的例子中,我实际上发现和都允许我编译我的程序,这增加了……我可以使用CFLAGS 或 CPPFLAGS来完成我的目标(至少在autoconf上下文中)。什么给予?)
发布于 2010-05-03 07:29:16
编译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++发布于 2010-05-02 21:45:29
CPPFLAGS宏是用来指定#include目录的宏。
在您的情况下,CPPFLAGS和CFLAGS都可以工作,因为make(1)规则将预处理和编译结合在一个命令中(因此在命令中使用了两个宏)。
如果使用表单.,则不需要将#include "..."指定为包含目录。您也不需要指定标准编译器包含目录。您确实需要指定所有其他包含目录。
发布于 2010-05-02 21:07:52
你在追隐式生成规则。
https://stackoverflow.com/questions/2754966
复制相似问题