1

Flex を使用して、自分の言語用のレクサーを開発しています。C++ でパーサーを作成したいのですが、独自のアプローチを使用しています。レクサーは C (Flex) にあるため、レクサー ( gcc -c lex.yy.c -lfl) とプログラム ( g++ -c file1.cc file2.cc ...) を別々にコンパイルし、それらをリンクして最終的な実行可能ファイルを作成したいと考えています。

特に、レクサーを作成した後、C++ プログラム用に次のコードを記述します。

#include <iostream>

extern int yylex();
int main(int argc, char** argv);

int main (int argc, char** argv) {
  yylex();
  return 0;
}

しかし、次のようにリンクするとリンクエラーが発生します。

g++ main.cc lex.yy.o -lfl

しかし、私はいつも得ます:

/tmp/ccBrHObp.o: In function `main':
main.cc:(.text+0x10): undefined reference to `yylex()'
collect2: ld returned 1 exit status

問題はどこだ?ありがとうございました

4

1 に答える 1

3

ここで何が起こるかというと、次のような C コードをコンパイルすることです。

int yylex() {
  // ...
}

yylexシンボルを生成します。次に、C++ コードをコンパイルします。C++ では、同じ名前の 2 つの異なる関数が存在できるため、関数の名前をシンボル名として使用することはできません。C++ コードを記述する場合int yylex();、GCC はこのシンボルを探します: _Z5yylexv. 見つからない、リンクエラー。解決策は、これは C 関数であり、その名前をシンボル名として使用する必要があると言うことです。

#include <iostream>

extern "C"
int yylex();

int main (int argc, char** argv) {
  std::cout << yylex() << std::endl;
  return 0;
}
于 2013-08-10T18:24:04.483 に答える