CFLAGS,CCFLAGS,CXXFLAGS – 这些variables究竟控制着什么?
我正在使用GNU make编译我的C ++代码,我想了解如何使我的编译可定制。
我在不同的地方读到CFLAGS
, CCFLAGS
和CXXFLAGS
用于这个目的。 那我该如何使用它们呢? 如果我有更多的命令行参数的编译器,我应该追加到CFLAGS
或prepend他们? 有没有普遍的做法?
为什么三个不同的variables? 我想C编译器应该得到CFLAGS
和CCFLAGS
,而C ++编译器应该得到CFLAGS
和CXXFLAGS
– 我知道了吗?
人类用户是否应该设置这些variables? 做任何自动工具( automake
, autoconf
等)设置它们? 我应该使用的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这样的东西。 有CFLAGS
, CPPFLAGS
和CXXFLAGS
。 用于C编译器的CFLAGS
,用于C ++的CXXFLAGS
和用于两者的CPPFLAGS
。
为什么CPPFLAGS
在? 通常,它是预处理器标志( -D
, -U
)的家,并且c和c ++都使用它们。 现在,每个人都想为c和c ++定义相同的环境的假设也许是可疑的,但却是传统的。