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++允许存在两个不同的同名函数,所以不能只用函数名作为符号名。当您编写int yylex();C++ 代码时,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 回答