makefile - CFLAGS 与 CPPFLAGS

标签 makefile autotools autoconf cflags

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

但我还是不明白其中的区别。

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

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

一般来说,如果预处理器找到并包含所需的头文件,为什么需要告诉它额外的包含目录? CFLAGS 到底有什么用呢?

(就我而言,我实际上发现两者都允许我编译我的程序,这增加了困惑......我可以使用 CFLAGS OR 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++

关于makefile - CFLAGS 与 CPPFLAGS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2754966/

相关文章:

c - 如果补丁无法应用,如何导致构建系统编译失败

c - Mac OS X 中的静态库

unit-testing - 如何使用 GNU 自动工具为 "make check"创建测试

linux - 查找要与 dlload 一起使用的共享库名称

latex - Autoconf/Automake 条件和 dist 规则

c - 如何静态编译lighttpd模块

c - 完全相同的命令行在 Make 中产生错误,但如果从 shell 运行则成功

ubuntu - Ubuntu 14.04 VM : -std=c++11 flag isn't being detected 上的 GCC 4.8.4 错误

c - 如何告诉自动工具在不同的文件夹中使用不同的实现

在 Eclipse 中更改 autotools C 项目的设置