【发布时间】:2020-08-30 09:05:36
【问题描述】:
我的 main.hpp 看起来像这样:
#include "json.tab.h"
#include "ob.hpp"
extern Ob *ob;
在我的 test.l 中,我写道:
%{
#include "main.hpp"
%}
%token KEY
%token COMMA
%%
KEY_SET : KEY {ob->someOp();}
| KEY_SET COMMA KEY {ob->someOp();}
%%
但这给了我:
C:\......c:(.text+0x37a): undefined reference to `ob'
C:\......c:(.text+0x38e): undefined reference to `Ob::someop()'
那么我怎样才能从解析器中的任何位置调用那个 Ob 对象呢?
我的 Ob 类(Ob.hpp):
#include <bits/stdc++.h>
using namespace std;
#ifndef O_H_
#define O_H_
using namespace std;
class Ob {
public:
Ob();
~Ob();
someop();
};
#endif /*O_H_*/
还有Ob.cpp:
Ob::someop()
{
cout << "c++ is lit" << endl;
}
现在我已经将 Ob 中的所有方法都设置为静态,这样就不需要实例了。我的构建规则看起来像这样:
g++ lex.yy.c test.tab.c main.cpp *.hpp -o test.exe
我把解析器生成器简单化了,没有任何方法调用,它工作正常,没有错误,没有警告:
%%
KEY_SET : KEY
| KEY_SET COMMA KEY
%%
当我添加{Ob::someOp();} 时,它又给了我同样的错误。
我所有的代码都在这里:https://gist.github.com/maifeeulasad/6d0ea58cd70fbe255a4834eb46f2e1fd
【问题讨论】:
-
错误消息说你没有定义
ob或Ob::someop()。您还没有显示任何定义这些内容的代码。因此,目前您收到这些错误对我来说并不奇怪。您是否声称您已经定义了ob和Ob::someop()?如果是这样,那么您应该显示该代码。由于这些是链接器错误,因此有关如何构建程序的一些详细信息也会有所帮助。 -
@john 我已经添加了我认为需要的所有代码,你能再检查一次吗?
-
好吧,如果这就是所有代码,那么
ob仍然没有定义,而Ob::someop()是语法错误(缺少返回类型,大概应该是void Ob::someop())。所以我只能假设你实际上并没有编译 Ob.cpp,否则你会看到编译器错误消息。 -
@john ,
main.hpp的第三个 sloc 有一个 Ob 的引用,带有 extern 关键字。而test.l正在导入或包含main.hpp..test.l不应该引用 Ob 吗?而且我也尝试过使用 void 关键字。最终构建规则有g++ lex.yy.c test.tab.c main.cpp -o test.exe,其中包含main.cpp。它包含main.hpp.. -
另外:(1)这个问题与flex或bison无关。这只是使问题感到困惑(也可能使您感到困惑)。首先弄清楚如何编写一个分布在多个文件中的 C++ 程序。然后,您可以将 flex 和 bison 添加到组合中。 (2) 除非您知道自己要什么,否则永远不要让 GCC 编译头文件 (
*.hpp)。 (你要的是一个预编译的头文件。如果你不知道那是什么,你不想要求构建一个。)(3)Ob.cpp 无法编译:<stdin>:13:12: error: ISO C++ forbids declaration of ‘someop’ with no type [-fpermissive]。请解决这个问题
标签: c++ compiler-construction linker-errors bison flex-lexer