6

当我尝试编译这个微不足道的 lex 程序的输出时:

# lex.l
integer   printf("found keyword INT");

使用:

$ gcc lex.yy.c

我得到:

Undefined symbols:
  "_yywrap", referenced from:
      _yylex in ccMsRtp7.o
      _input in ccMsRtp7.o
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

lex --version 告诉我我实际上使用的是“flex 2.5.35”,尽管 ls -fla `which lex` 不是符号链接。为什么输出无法编译的任何想法?

4

2 回答 2

20

来自Flex 手册

我收到关于未定义 yywrap() 的错误。

您必须提供自己的 yywrap() 函数,或链接到 libfl.a(提供一个),或使用

%option noyywrap

在您的消息来源中说您不想要 yywrap() 函数。

还:

当扫描器从 YY_INPUT 接收到文件结束指示时,它会检查 yywrap() 函数。如果 yywrap() 返回 false(零),则假定该函数已执行并设置 yyin 指向另一个输入文件,然后继续扫描。如果它返回真(非零),则扫描器终止,向其调用者返回 0。请注意,在任何一种情况下,开始条件都保持不变;它不会恢复为 INITIAL。

于 2010-04-10T06:11:46.073 回答
0

正如 Eli 的回答所暗示的那样,这不是一个简单的 lex 程序。它是一个微不足道的 lex文件,因此是程序的一部分,但它(就像任何 lex 文件一样)需要与一些 C 代码组合才能构成一个完整的程序。特别是,你仍然需要一个main函数(你用 C 或 C++ 或其他东西在一个单独的文件中编写),你还需要编写一个yywrap函数来提供 lex 代码和其余 C 代码之间的接口。

于 2010-04-10T06:05:22.000 回答