CFLAGS,CCFLAGS,CXXFLAGS – 这些variables究竟控制着什么?

我正在使用GNU make编译我的C ++代码,我想了解如何使我的编译可定制。

我在不同的地方读到CFLAGSCCFLAGSCXXFLAGS用于这个目的。 那我该如何使用它们呢? 如果我有更多的命令行参数的编译器,我应该追加到CFLAGS或prepend他们? 有没有普遍的做法?

为什么三个不同的variables? 我想C编译器应该得到CFLAGSCCFLAGS ,而C ++编译器应该得到CFLAGSCXXFLAGS – 我知道了吗?

人类用户是否应该设置这些variables? 做任何自动工具( automakeautoconf等)设置它们? 我应该使用的linux系统没有定义任何这些variables – 这是典型的吗?

目前我的Makefile看起来像这样,我觉得它有点肮脏:

 ifdef code_coverage GCOV_FLAG := -fprofile-arcs -ftest-coverage else GCOV_FLAG := endif WFLAGS := -Wall INC_FLAGS := -Istuff -Imore_stuff -Ietc CCFLAGSINT := -O3 $(WFLAGS) $(INC_FLAGS) $(CCFLAGS) ... (somewhere in the makefile, the command-line for compilation looks like this) $(CC) $(CCFLAGSINT) -c $< -o $@ ... (somewhere in the makefile, the command-line for linking looks like this) $(CC) $(GCOV_FLAG) $(CCFLAGSINT) $(OBJLIST) $(LDFLAGS) -o $@ 

我很确定这里没有错误; Makefile工作得很好。 但有没有什么违反惯例(如CCFLAGSINT – 我应该改写CCFLAGS还是CXXFLAGS ?FUD!)

对不起,有这么多的问题; 你显然不会回答他们,但我希望答案能帮助我理解这些设置背后的总体思路。

正如你注意到的,这些是Makefile {macros或variables},而不是编译器选项。 他们实施一套公约。 (macros是它们的一个旧名称,仍然被一些GNU make doc调用它们variables。)

名字唯一的原因是默认的make规则,通过make -p可以看到,它们使用了其中的一些。

如果你写所有你自己的规则,你可以select所有你自己的macros名称。

在一个香草牛乳中,没有CCFLAGS这样的东西。 有CFLAGSCPPFLAGSCXXFLAGS 。 用于C编译器的CFLAGS ,用于C ++的CXXFLAGS和用于两者的CPPFLAGS

为什么CPPFLAGS在? 通常,它是预处理器标志( -D-U )的家,并且c和c ++都使用它们。 现在,每个人都想为c和c ++定义相同的环境的假设也许是可疑的,但却是传统的。