我已经阅读了CFLAGS and CPPFLAGS之间的区别。但我的Makefile.am目前同时使用DEFS和CPPFLAGS,我不确定它们之间的区别。
DEFS += -DLOCALEDIR=\"$(localedir)\" -DDATADIR=\"$(datadir)\" -DPKGDATADIR=\"$(pkgdatadir)\"
和
src_foo_CPPFLAGS = \
$(AM_CPPFLAGS) \
-I$(top_builddir)/src \
-DDATADIR='"$(datadir)"' \
-DMODULEDIR='"$(moduledir)"' \
-DLIBEXECDIR='"$(libexecdir)"'
CPPFLAGS和DEFS似乎都使用-D
选项创建定义。那么差异是什么呢?我可以删除DEFS
并将缺少的定义(PKGDATADIR
和LOCALEDIR
)添加到CPPFLAGS
吗?
答案 0 :(得分:4)
DEFS
在autoconf中定义如下:
-D传递给C编译器的选项。如果调用AC_CONFIG_HEADERS,则configure将'@ DEFS @'替换为-DHAVE_CONFIG_H(参见 配置标题)。配置时未定义此变量 仅在创建输出文件时执行其测试。看到 设置输出变量,以便检查以前的结果 测试
使用-p
标记执行make时(例如make -p > rules
)。我们可以检查生成的rules
文件,找出make实际上会做什么。
假设调用AC_CONFIG_HEADERS
宏,则DEFS
最初定义如下:
DEFS = -DHAVE_CONFIG_H
假设我们将DEFS
定义如下:
DEFS += \
-DLOCALEDIR=\"$(localedir)\" \
-DDATADIR=\"$(datadir)\" \
-DPKGDATADIR=\"$(pkgdatadir)\"
然后DEFS
将如下所示:
DEFS = -DHAVE_CONFIG_H -DLOCALEDIR=\"$(localedir)\" -DDATADIR=\"$(datadir)\" \
-DPKGDATADIR=\"$(pkgdatadir)\"
接下来让我们看一下在使用automake生成的Makefile中DEFS
的使用方式,Makefile中的编译规则如下所示:
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
我们可以看到,DEFS
首先显示,然后是其他一些变量和AM_CPPFLAGS
每次出现DEFS
时,都会出现另一次出现AM_CPPFLAGS
及其变体,例如foo_CPPFLAGS
。
因此,为了结束这个问题,我认为可以删除DEFS
,而其内容可以放入CPPFLAGS
。我还在autotools频道的IRC上问过这个问题。有人向我建议,不要使用DEFS
而只使用CPPFLAGS
。