首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CFLAGS与CPPFLAGS

CFLAGS与CPPFLAGS
EN

Stack Overflow用户
提问于 2010-05-02 21:02:09
回答 6查看 133.6K关注 0票数 121

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

但我还是不明白区别。

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

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

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

(在我的例子中,我实际上发现都允许我编译我的程序,这增加了……我可以使用CFLAGS CPPFLAGS来完成我的目标(至少在autoconf上下文中)。什么给予?)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-05-03 07:29:16

编译C程序的隐式生成规则是

代码语言:javascript
复制
%.o:%.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<

其中,$()语法扩展了变量。由于在编译器调用中同时使用了CPPFLAGSCFLAGS,因此定义包含路径是个人喜好的问题。例如,如果foo.c是当前目录中的文件

代码语言:javascript
复制
make foo.o CPPFLAGS="-I/usr/include"
make foo.o CFLAGS="-I/usr/include"

将以完全相同的方式调用编译器,即

代码语言:javascript
复制
gcc -I/usr/include -c -o foo.o foo.c

当您有多种需要相同的包含路径的语言时,这两种语言之间的区别就会起作用,例如,如果您有bar.cpp,然后尝试

代码语言:javascript
复制
make bar.o CPPFLAGS="-I/usr/include"
make bar.o CFLAGS="-I/usr/include"

然后编译将是

代码语言:javascript
复制
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中得到类似的结果。

代码语言:javascript
复制
CPPFLAGS=-I/usr/include
CFLAGS=-std=c99
CXXFLAGS=-Weffc++
票数 167
EN

Stack Overflow用户

发布于 2010-05-02 21:45:29

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

在您的情况下,CPPFLAGSCFLAGS都可以工作,因为make(1)规则将预处理和编译结合在一个命令中(因此在命令中使用了两个宏)。

如果使用表单.,则不需要将#include "..."指定为包含目录。您也不需要指定标准编译器包含目录。您确实需要指定所有其他包含目录。

票数 11
EN

Stack Overflow用户

发布于 2010-05-02 21:07:52

你在追隐式生成规则

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2754966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档