首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >未定义对yywrap的引用

未定义对yywrap的引用
EN

Stack Overflow用户
提问于 2009-11-28 08:30:58
回答 5查看 71.6K关注 0票数 94

我有一个简单的“语言”,我正在使用Flex(词法分析器),它是这样的:

代码语言:javascript
运行
复制
/* Just like UNIX wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}

%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n        { chars++; lines++; }
.         { chars++; }
%%

int main()
{
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
}

我运行了一个flex count.l,一切正常,没有出现错误或警告,然后当我尝试执行cc lex.yy.c时,我得到了这个错误:

桌面ubuntu@eeepc:~/

$ cc lex.yy.c

/tmp/ccwwkhvq.o: In function yylex': lex.yy.c:(.text+0x402): undefined reference toyywrap‘

/tmp/ccwwkhvq.o: In function input': lex.yy.c:(.text+0xe25): undefined reference toyywrap‘

collect2: ld返回了1个退出状态

出什么问题了?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-28 08:42:24

扫描程序在文件末尾调用此函数,因此您可以将其指向另一个文件并继续扫描其内容。如果您不需要这个,可以使用

代码语言:javascript
运行
复制
%option noyywrap

在扫描仪规格中。

虽然禁用yywrap肯定是最好的选择,但也可以链接到-lfl,以使用flex提供的库fl (即libfl.a)中的默认yywrap()函数。Posix要求该库具有链接器标志-ll,而默认的OS安装只提供该名称。

票数 144
EN

Stack Overflow用户

发布于 2014-07-24 12:49:44

我更喜欢定义我自己的yywrap()。我是用C++编译的,但重点应该很明显。如果有人使用多个源文件调用编译器,我会将它们存储在一个列表或数组中,然后在每个文件的末尾调用yywrap(),让您有机会继续处理新文件。

代码语言:javascript
运行
复制
int yywrap() {
   // open next reference or source file and start scanning
   if((yyin = compiler->getNextFile()) != NULL) {
      line = 0; // reset line counter for next source file
      return 0;
   }
   return 1;
}
票数 13
EN

Stack Overflow用户

发布于 2016-08-01 23:39:33

flex并不总是与它的开发库一起安装(这很奇怪,因为它是一个开发工具)。安装库,生活就会更好。

在Redhat基本系统上:

代码语言:javascript
运行
复制
yum -y install flex-devel
./configure && make

基于Debian的系统

代码语言:javascript
运行
复制
sudo apt-get install libfl-dev
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1811125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档