1

私はANTLRを学び、このチュートリアルを使用してC出力コードで動作させようとしています(この質問でも参照されています)。ANTLR でレクサーとパーサーを C ソースとして生成することに成功しましたが、Mac OS X Snow Leopard (i686-apple-darwin10-gcc-4.2.1) で gcc を使用してコンパイルすることはできません。以下は、「SimpleCalcLexer.c」をコンパイルしようとしたときの結果です。

dyn-72-33-132-199:Desktop bf$ gcc -o lexer SimpleCalcLexer.c
Undefined symbols:
  "_main", referenced from:
      start in crt1.10.6.o
  "_antlr3LexerNewStream", referenced from:
      _SimpleCalcLexerNewSSD in ccjXa6NU.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

SimpleCalcLexer.c ファイルはどこにも "main" を参照していません (定義もされていません) が、パーサーそれを定義しているので、それをコンパイルしようとしました:

dyn-72-33-132-199:Desktop bf$ gcc -o parser SimpleCalcParser.c
Undefined symbols:
  "_antlr3CommonTokenStreamSourceNew", referenced from:
      _main in ccn8ZVhk.o
  "_antlr3ParserNewStream", referenced from:
      _SimpleCalcParserNewSSD in ccn8ZVhk.o
  "_SimpleCalcLexerNew", referenced from:
      _main in ccn8ZVhk.o
  "_antlr3AsciiFileStreamNew", referenced from:
      _main in ccn8ZVhk.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

いくつかの質問があります:
1) 私は何を間違っていますか? コードには他のantlr関数と定義が見つかっているため、ライブラリが見つかっていると確信しています。gcc を間違って呼び出していますか? (コマンドラインでこれほど複雑なものをコンパイルしたことはありません。)
2) とはccn8ZVhk.o? これがオブジェクト コード ファイルであることはわかりますが、私のシステムでは見つかりません (locateとの両方mdfind)。

4

2 に答える 2

4

You need to compile the lexer and the parser into the same executable; they work together to create a single program. Try this:

gcc -o lexer SimpleCalcLexer.c SimpleCalcParser.c -lantlr3c

That command line will compile the lexer and the parser and then link the result with the ANTLR library (the "-lantlr3c" part).

The object file ccn8ZVhk.o is part of the runtime library and is what actually calls main(). It doesn't contain user-servicable parts.

于 2009-12-03T08:55:19.387 に答える
0

複数回コンパイルすると、オブジェクト コードのファイル名が毎回変わることがわかります。そのため、最終的なターゲットがコンパイルおよびリンクされる前に使用される一時的なオブジェクト ファイルであると推測されます。同じ問題が発生し、アーキテクチャを 386 および 686 として指定しようとしました。このPython3 文法ファイルの出力をコンパイルしようとしています。CajunLuke、それが機能したときにコンパイルに使用した正確なコマンドを投稿できますか? これが私がやったことのサンプルです:

WOPR:plex pokstad$ gcc -arch i686 -o lexer python3Lexer.c python3Parser.c -lantlr3c
Undefined symbols:
"_main", referenced from:
  start in crt1.10.6.o
"_python3Lexer_syntetizeEmptyString", referenced from:
  _mLEADING_WS in ccGDusga.o
"_python3Lexer_createLexerToken", referenced from:
  _mCONTINUED_LINE in ccGDusga.o
  _mLEADING_WS in ccGDusga.o
"_python3Lexer_initLexer", referenced from:
  _python3LexerNewSSD in ccGDusga.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

また、ANTLR3C ランタイムは、通常の「configure;make;make install」とは異なる方法でコンパイルしましたか? 64 ビット オプションを使用してコンパイルしようとしましたが、同じ問題が発生しました。

于 2009-12-07T04:37:20.403 に答える