【问题标题】:What is the difference between DEFS and CPPFLAGS in autoconf and automakeautoconf和automake中的DEFS和CPPFLAGS有什么区别
【发布时间】:2014-07-16 04:28:15
【问题描述】:

我已经阅读了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 并将缺少的定义(PKGDATADIRLOCALEDIR)添加到CPPFLAGS 吗?

【问题讨论】:

  • manual 建议通过CPPFLAGS/AM_CPPFLAGS 执行此操作:“您应该将 -DDATADIR='$(datadir)' 添加到 makefile 的 CPPFLAGS 定义中”。

标签: autoconf automake


【解决方案1】:

DEFS在autoconf中定义如下:

-D 选项传递给 C 编译器。如果调用了 AC_CONFIG_HEADERS,configure 将用 -DHAVE_CONFIG_H 替换“@DEFS@”(参见 配置头文件)。配置时未定义此变量 仅在创建输出文件时执行其测试。看 设置输出变量,如何检查以前的结果 测试。

当使用 -p 标志执行 make 时(例如 make -p > rules)。我们可以检查生成的 rules 文件,以了解 make 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)\"

接下来看看DEFS在automake生成的Makefile中的使用方式,Makefile中的编译规则如下:

COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
          $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)

我们可以看到,DEFS 首先出现,然后是其他一些变量和 AM_CPPFLAGS 每次出现DEFS 之后总是会出现另一次AM_CPPFLAGS 及其变体,例如foo_CPPFLAGS

所以总结这个问题,我认为很明显DEFS 可以删除,而是可以将其内容放入CPPFLAGS。我还在自动工具频道的 IRC 上问了这个问题。有人建议我,不要使用DEFS,而只使用CPPFLAGS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2012-06-23
    • 1970-01-01
    相关资源
    最近更新 更多