2011-07-10 3 views
0

私はFlexとBisonを使用してコンパイラを作成しています。自分のプログラム用にAST(Abstract Syntax Tree)を作成しようとしているので、C++に移植する必要があります。私のコンパイラからかなりあいまいなエラーが発生しましたまで、これまでのところ私は、成功している:ここでFlex C++ VTableエラー

Kraken.o: In function Kraken::FlexScanner::FlexScanner()': Kraken.cc:(.text._ZN6Kraken11FlexScannerC2Ev[_ZN6Kraken11FlexScannerC5Ev]+0x26): undefined reference to vtable for Kraken::FlexScanner' Kraken.o: In function Kraken::FlexScanner::~FlexScanner()': Kraken.cc:(.text._ZN6Kraken11FlexScannerD2Ev[_ZN6Kraken11FlexScannerD5Ev]+0xb): undefined reference to vtable for Kraken::FlexScanner'

は、関連するすべてのコードです:

Kraken.cc:

#include "KrakenScanner.hh" 
#include "KrakenParser.hh" 
int main(int argc, char * argv[]) { 
    Kraken::Parser parser; 
    return parser.parse(); 
} 

KrakenScanner .hh:

#ifndef KRAKENSCANNER_HH_ 
#define KRAKENSCANNER_HH_ 
#if ! defined(yyFlexLexerOnce) 
#include <FlexLexer.h> 
#endif 
#undef YY_DECL 
#define YY_DECL int Kraken::FlexScanner::yylex() 
#include "parser.hh" 
namespace Kraken { 
    class FlexScanner : public yyFlexLexer { 
     public: 
      int yylex(Kraken::BisonParser::semantic_type* lval); 

     private: 
      int yylex(); 
      Kraken::BisonParser::semantic_type* yylval; 
    }; 
} 

#endif /* KRAKENSCANNER_HH_ */ 

KrakenScanner.cc:

#include "KrakenScanner.hh" 
int Kraken::FlexScanner::yylex(Kraken::BisonParser::semantic_type* lval) { 
    yylval = lval; return yylex(); 
} 

のMakefile:

OBJS := Kraken.o parser.o scanner.o KrakenScanner.o KrakenParser.o 
%.cc: %.y 
    bison -o $(@:%.o=%.d) $< 
%.cc: %.l 
     flex -o$(@:%.o=%.d) -i $< 
all: $(OBJS) 
    g++ -okraken $(OBJS) 
Kraken.o: Kraken.cc KrakenScanner.o KrakenParser.o 
KrakenScanner.o: KrakenScanner.hh KrakenScanner.cc parser.o 
parser.o: parser.hh parser.cc 
parser.cc: parser.y 
scanner.o: scanner.cc 
scanner.cc: scanner.l 
KrakenParser.o: KrakenParser.hh KrakenParser.cc KrakenScanner.o` 

これが役立つかどうかは知りませんが、FlexLexer.hは、クラスFlexLexerとyyFlexLexerを定義します。 FlexLexerは仮想デストラクタを宣言し、yyFlexLexerはコンストラクタとデストラクタの両方を定義します。また、私はconstrをオーバーロードしようとします。とdestr。 Kraken.ccで、私は2つが「暗黙的に定義されている」というエラーが出ます。

+0

コンパイルのためにオブジェクトファイルをメイクファイルルールに入れないでください。 –

答えて

0

クリーンリビルド(rm *.o)を試して再コンパイルしてください。コンパイラは自動的にこのようなものを生成することになっています。いくつかのコンパイラは、vテーブルのリンクに影響を与えるspecial non-portable magicを持っていますが、私はあなたのコードのようなものは表示されません。


はまた、私はあなたがg++とリンクするためのルールを書いて、あなたのメイクファイルに表示されていますが、コンパイルのための任意のルールを書いていません。したがって、makeは、組み込み規則を使用しています。これは、OSによって提供されるC++コンパイラによっては、g++ではなく、

もう1つのことは、メイクファイルのルールが最初にプライマリソースを配置する必要があるということです。たとえば、次のように

間違っ:

KrakenScanner.o: KrakenScanner.hh KrakenScanner.cc parser.o 

右:最後に、オブジェクト・ファイルにのみリンク時に、他のオブジェクトファイルを構築するために使用されていない

KrakenScanner.o: KrakenScanner.cc KrakenScanner.hh 

+0

命令を実行した後も以前と同じエラーが発生しています。 – singerng

+0

@user:いくつかのアイデアを追加しました。 –

0

まず、そのエラーメッセージは、コンパイラではなくリンカーからのものです。あなたがKrakenScanner.oでリンクしていないようです。また、コンパイラの名前demanglerをコンパイラ/リンカのエラー出力に適用するのに役立ちます。

どのコンパイラを使用していますか?

+0

名前demanglerは私にKraken :: FlexScanner :: FlexScanner()とKraken :: FlexScanner ::〜FlexScanner()をくれました。 – singerng

関連する問題