【问题标题】:Link error when using lex and yacc output in Visual Studio在 Visual Studio 中使用 lex 和 yacc 输出时出现链接错误
【发布时间】:2011-01-22 20:41:30
【问题描述】:

我正在使用 flex (lex) 和 bison (yacc) 的 windows version 将我的查询编译器从 linux 移植到 Windows。 输出文件lex.yy.cy.tab.cy.tab.h 正在正确生成。 但是,我收到以下链接错误。

Error 29 error LNK2001: unresolved external symbol _yylval G:\Project\lex.yy.obj QC
Error 30 error LNK1120: 1 unresolved externals G:\Project\QC.exe QC

我尝试将上述由 flex 和 yacc 的原始 linux 版本生成的文件复制到 Visual Studio 项目文件夹中。但这也给出了相同的链接错误。

【问题讨论】:

    标签: c++ visual-studio-2010 yacc lex


    【解决方案1】:

    这可能是因为您在一个项目中混合了 C++ 和 C 文件。因此,如果您将y.tab.h 包含到.cpp 文件中,请确保它周围有extern "C" { ... }。像这样:

    extern "C"
    {
        #include "y.tab.h"
    }
    

    更新:根据您的评论,我了解到 y.tab.c 现在是 y.tab.cc。这会导致链接时间错误。这可以通过将两个文件都设为 C++(或 C)来解决。或者通过将y.tab.h 中的yylval 声明更改为

    #ifdef __cplusplus
    extern "C" YYSTYPE  yylval;
    #endif
    

    【讨论】:

    • y.tab.h 包含在自动生成的文件 lex.yy.c 中。事实上,包含部分是在 lex Lexer.l 的输入文件中指定的。
    • 您的项目中在哪里定义了yylval?通常它在y.tab.c。那可能是您的 .c 文件之一被编译为 C++ 吗?
    • 是的,这是个问题。 yylval 变量现在在 C++ 文件中定义,不再在 C 文件中可见。简单的解决方案是将所有文件制作为 C++。我不知道他们是否会像那样编译。
    • 尝试删除#ifndef __cplusplus。您可能想在 Windows 上使用_isatty。 MSDN 说 isatty 已弃用。
    • 然后完全删除 isatty 原型,而只删除 #include <io.h>。我认为应该这样做。
    【解决方案2】:

    在我看来,这就像你在 unix 上链接 flex 或 bison 的库(我使用它已经有一段时间了,所以我不记得你必须链接的确切内容)但在 windows 上没有这样做。您是否与 Windows 上的相同库链接?

    【讨论】:

    • 不,我没有错过任何图书馆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多