分享
为什么问答平台  ›  专栏  ›  技术社区  ›  edthix

在VC下编译bison&flex程序时遇到的困难++ - unistd.h related difficulty when compiling bison & flex program under vc++

  •  21
  • edthix  · 技术社区  · 2 月前

    我使用的是bison&flex(通过cygwin下载)和vc++。当我编译程序时,我得到一个错误:

    ...: fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory
    

    flex生成文件中的对应代码是:

    #ifndef YY_NO_UNISTD_H
    /* Special case for "unistd.h", since it is non-ANSI. We include it way
     * down here because we want the user's section 1 to have been scanned first.
     * The user has a chance to override it with an option.
     */
    /* %if-c-only */
    #include <unistd.h>
    /* %endif */
    /* %if-c++-only */
    /* %endif */
    #endif
    

    如果我在flex文件(.l)中定义yy_no_unistd_h,此错误将消失,但我会得到其他几个错误:

    ...: error C2447: '{' : missing function header (old-style formal list?)
    ...: warning C4018: '<' : signed/unsigned mismatch
    ...: error C3861: 'isatty': identifier not found
    

    我如何解决这个问题?

    所有这些错误都发生在flex生成的扫描仪中。

    我知道这是因为unistd.h不存在于windows中。我必须写自己的单曲吗?如果是,如何写它来消除这些错误?

    8 回复  |  直到 2 年前
        1
  •  15
  •   Rudi    9 年前

    isatty 由lexer用于确定输入流是终端还是管道/文件。lexer使用此信息更改其缓存行为(lexer在不是终端时读取大量输入)。如果你知道你的程序永远不会以交互方式使用,你可以添加 %option never-interactive 对你来说。当使用用户输入运行程序时,使用 %option interactive . 当两种用途都需要时,您可以生成一个交互式lexer,在批处理模式下使用时会造成性能损失,或者提供您自己的lexer。 伊萨蒂 功能。

        2
  •  14
  •   Dr. Alex RE    7 年前

    使用 %option nounistd 在你 .l 删除依赖项的文件 unistd.h .

        3
  •  9
  •   flyontheweb    9 年前

    以防有人仍然有这个问题, flex的devel文件中包含unistd.h。 我在这里找到这个:

    http://sourceforge.net/tracker/index.php?func=detail&aid=931222&group_id=23617&atid=379173

    简而言之,只要确保编译器能够访问它。在我的例子中,它只是将“c:\gnuwin32\include”添加到附加的包含目录中。

        4
  •  5
  •   Alexander Egorov    2 年前

    使用带选项的win_flex.exe--wincompat,您不需要破解lex文件

        5
  •  2
  •   Eyvind    1 年前

    unistd.h 是一个unix头文件,所以它不存在于vc++中;最好的办法是在cygwin(或mingw/msys)中使用g++编译它。你也可以看看 this question 其他建议。

        6
  •  1
  •   Yariv    1 年前

    我使用的是来自gnuwin32项目的flex 2.5.4,它不检查 YY_NO_UNISTD_H .

    在我的版本中,Flex只在编译为C++时寻找UNIDSD.H,所以如果您的话,您可以省去所有这些麻烦。 yylval 不使用任何C++构造。

    我必须在YayVall中使用STL(使用指针使其成为POD类型),所以为了使C++中的Flex编译,我创建了这个简单的 美国独立学院 :

    #include <io.h>
    

    仅此而已(实际上,我可以复制gnuwin32附带的unistd.h文件,比如flyontheeb suggests )

    P.S.总结:在Bison中,我把Yylval所需的stl头文件放在 %code requires {} 并将当前目录添加到makefile中的include路径。

        7
  •  0
  •   Sacha Nath    5 年前

    我太晚了,但无论如何,我会分享我的发现来拯救仍在寻找答案的人。 在我的例子中,编译器查找头的位置有一个空的unistd.h文件。

        8
  •  0
  •   smit    4 年前

    好吧,这篇文章很旧,但我也面临同样的问题,这里有一些东西应该有用。 WinFlexBison