我已经阅读了CFLAGS 和 CPPFLAGS之间的区别。但是我的 Makefile.am 目前同时使用 DEFS 和 CPPFLAGS,我不确定其中的区别。
DEFS += -DLOCALEDIR=\"$(localedir)\" -DDATADIR=\"$(datadir)\" -DPKGDATADIR=\"$(pkgdatadir)\"
Run Code Online (Sandbox Code Playgroud)
和:
src_foo_CPPFLAGS = \
$(AM_CPPFLAGS) \
-I$(top_builddir)/src \
-DDATADIR='"$(datadir)"' \
-DMODULEDIR='"$(moduledir)"' \
-DLIBEXECDIR='"$(libexecdir)"'
Run Code Online (Sandbox Code Playgroud)
CPPFLAGS 和 DEFS 似乎都使用该选项创建定义-D。那么有什么区别。我可以删除DEFS并添加缺少的定义(PKGDATADIR和LOCALEDIR)CPPFLAGS吗?
DEFS 在 autoconf 中定义如下:
-D 选项传递给 C 编译器。如果 AC_CONFIG_HEADERS 被调用,configure 用 -DHAVE_CONFIG_H 替换 '@DEFS@'(参见配置头文件)。这个变量在 configure 执行测试时没有定义,只有在创建输出文件时才定义。有关如何检查以前测试的结果,请参阅设置输出变量。
当使用-p标志(例如make -p > rules)执行 make 时。我们可以检查生成的rules文件以找出 make make 实际执行的操作。
假设AC_CONFIG_HEADERS宏被调用,那么DEFS最初定义如下:
DEFS = -DHAVE_CONFIG_H
Run Code Online (Sandbox Code Playgroud)
假设我们定义DEFS如下:
DEFS += \
-DLOCALEDIR=\"$(localedir)\" \
-DDATADIR=\"$(datadir)\" \
-DPKGDATADIR=\"$(pkgdatadir)\"
Run Code Online (Sandbox Code Playgroud)
然后DEFS看起来像这样:
DEFS = -DHAVE_CONFIG_H -DLOCALEDIR=\"$(localedir)\" -DDATADIR=\"$(datadir)\" \
-DPKGDATADIR=\"$(pkgdatadir)\"
Run Code Online (Sandbox Code Playgroud)
接下来看一下DEFSautomake生成的Makefile中使用的方式,Makefile中的编译规则是这样的:
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,DEFS首先出现,然后是其他一些变量,并且AM_CPPFLAGS
每进一步出现的DEFS总是后跟另一个出现的AM_CPPFLAGS及其变体,例如foo_CPPFLAGS。
所以总结这个问题,我认为很明显DEFS可以删除,而是可以将其内容放入CPPFLAGS. 我也在自动工具频道的 IRC 上问过这个问题。有人向我建议,不要使用DEFS而只使用CPPFLAGS.