【问题标题】:Flex (Lex, not actionscript or whatever) ErrorFlex(Lex,而不是 actionscript 或其他)错误
【发布时间】:2011-02-07 18:24:16
【问题描述】:

我对 flex 完全陌生。

我在使用 flex 时遇到构建错误。也就是说,我使用 flex 生成了一个 .c 文件,并且在运行它时出现此错误:

1>lextest.obj : error LNK2001: unresolved external symbol "int __cdecl isatty(int)" (?isatty@@YAHH@Z)
1>C:\...\lextest.exe : fatal error LNK1120: 1 unresolved externals

这是我正在使用的 lex 文件(取自 here):

/*** Definition section ***/

%{
/* C code to be copied verbatim */
#include <stdio.h>
%}

/* This tells flex to read only one input file */
%option noyywrap


%%
    /*** Rules section ***/

    /* [0-9]+ matches a string of one or more digits */
[0-9]+  {
            /* yytext is a string containing the matched text. */
            printf("Saw an integer: %s\n", yytext);
        }

.       {   /* Ignore all other characters. */   }

%%
/*** C Code section ***/

int main(void)
{
    /* Call the lexer, then quit. */
    yylex();
    return 0;
}

同样,为什么我必须在 lex 语法代码中放置一个“主”函数?我想要的是能够调用 yylex();来自另一个 c 文件。

【问题讨论】:

    标签: windows lex flex-lexer


    【解决方案1】:

    Q1 链接错误

    isatty() 函数看起来有点混乱。它不会显示在您显示的代码中 - 但它可能会在 flex 生成的代码中被引用。如果是这样,您似乎正在使用 C++ 编译器进行编译,并且 isatty() 函数被视为具有 C++ 链接的函数并且没有被发现 - 它通常是具有 C 链接的函数,需要用C++ 代码中的“extern "C" int isatty(int);”。

    要解决这个问题,请追踪isatty() 是否出现在生成的C 中。如果是,还要追踪它的声明位置(它的POSIX 标准标头是&lt;unistd.h&gt;)。

    第二季度主要

    您不必将主程序放在带有词法分析器的文件中。实际上,您通常不会这样做,否则其中的主程序将只是一个用于单独测试词法分析器的虚拟程序(并且只能有条件地编译到代码中 - 在 #ifdef TEST / #endif 或等效代码中)。

    是什么让你认为你必须这样做?

    【讨论】:

    • +1 - 谢谢!我在 flex 文件中添加了 extern 代码作为 c 代码,效果很好。我唯一的另一个问题是:每次我生成一个 c 文件时,以下内容都包含在其中一行中:“#include ”,我希望它不要那样做。有什么想法吗?
    • (无法再编辑)要回答你的最后一个问题,我说我必须这样做的原因是,如果我尝试从我的正常 main() 调用 yylex,它只是说找不到函数。
    • @incrediman:这取决于 flex 的来源……有时会有一个模板文件将 flex 复制到其输出中;有时,该文件的内容会内置到 flex 中。如果有文件,你可以破解它——小心升级。如果文件被编译成 flex 二进制文件,您需要构建自己的,或者报告错误,或者使用 C 编译器编译 flex 代码(然后您可以链接到 C++ 编译器 - 但请确保您指定在您的其余代码中,yylex() 具有 C 链接。
    • @incrediman:对于 main() 程序的东西——我认为,这又是 C++ 与 C 的链接。我已经在之前的评论中暗示过了。
    • @Jnathon 谢谢!这真的很有帮助!是的(@你的最后评论) - 你是对的!对此感到抱歉:)
    【解决方案2】:

    链接错误看起来像是您尝试在 Windows 上使用非 Windows 原生版本的 flex,但它无法正常工作。如果使用cygwin自带的flex版本,需要用cygwin的编译器和链接器编译链接程序。

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      相关资源
      最近更新 更多