【问题标题】:autotools with bison and flex sources带有野牛和弹性源的自动工具
【发布时间】:2013-01-22 11:12:22
【问题描述】:

我有一个包含 flex 和 bison 源文件的 C 项目; flex 文件#includes bison 生成的 tab.h 文件。

所以我已将 AC_PROG_LEX 和 AC_PROG_YACC 添加到我的 configure.ac 文件中。但是在我运行 autotools 并尝试制作项目之后,flex 生成的 .c 文件被编译 before bison 已运行以生成 tab.h 文件 #included 由 flex 。 c 文件。因此编译失败。

我是一个非常喜欢 autotools(和 stackoverflow!)的新手 - 我需要让 autotools 了解 flex .o 对 bison .tab.h 的依赖吗?如果是这样,该依赖项将放在哪里 - 在包含项目 SOURCES 列表的 Makefile.am 中?

TIA 约翰

【问题讨论】:

  • 您按照here的步骤操作了吗?如果您想获得任何有用的帮助,您需要发布Makefile.am的相关部分。
  • 不,恐怕我没有发现。我还没有消化它,但希望它能提供答案;非常感谢。

标签: bison autotools flex-lexer


【解决方案1】:

你需要告诉 automake 头文件是要构建的,而不是你已经提供的。把它放在 Makefile.am 中:

BUILT_SOURCES = tab.h

【讨论】:

  • 我有同样的问题这个答案并没有说如何确保野牛必须在flex之前执行。在我的Makefile.am 文件中,我有这个规则:pgfs_cmplr_SOURCES = src/lab/pgfs_cmplr.y src/lab/pgfs_cmplr.lBUILT_SOURCES = src/lab/pgfs_cmplr.h 但它不会生成任何*.tab.h 文件,这是pgfs_cmplr.l 所必需的,因为它是#include 它。我尝试了许多名称,例如:y.tab.hpgfs_cpmlr.tab.hpgfs_cpmlr.h 等,我也尝试过手动编译(不使用自动工具)并且它可以工作,所以我们可以知道 *.y 和 @987654332 @ 没问题,这是一个自动工具配置问题
【解决方案2】:

根据我的经验,你不能让解析器和扫描器使用相同的前缀。

也就是说,

bin_PROGRAM = baz
AM_YFLAGS = -d
BUILT_SOURCES = foo.h
baz_SOURCES = main.c foo.l foo.y

不会起作用,但是

bin_PROGRAM = baz
AM_YFLAGS = -d
BUILT_SOURCES = bar.h
baz_SOURCES = main.c foo.l bar.y

将确保automakefoo.l 之前构建bar.y

因此,请确保您的扫描仪和解析器使用不同的文件名,一切顺利。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多