无法编译 flex & bison(未找到符号 x86_64)
Can't compile flex & bison (Symbols not found x86_64)
我试图在我的 Mac 运行 Yosemite 上用 Flex & Bison 编译一个简单的程序,但出现以下错误:
未定义的体系结构符号x86_64:
“_yyerror”,引用自:
_yyparse 在 pr1-19c182.o
ld:未找到体系结构符号 x86_64
clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
我的两个文件看起来像这样,它们可以在我老师的 Ubuntu 安装上编译,但我无法让它们在我的 Mac:
上运行
pr1.y
%{
#include <stdio.h>
%}
%%
expr : expr '+' term {printf(" + ");}
| term
;
term : term '*' fact {printf(" * ");}
| fact
;
fact : "(" expr ")"
| '0' {printf("0");}
| '1' {printf("1");}
| '2' {printf("2");}
| '3' {printf("3");}
| '4' {printf("4");}
| '5' {printf("5");}
| '6' {printf("6");}
| '7' {printf("7");}
| '8' {printf("8");}
| '9' {printf("9");}
%%
pr1.l
%{
#include "pr1.tab.h"
%}
%%
[0-9] {return (yytext[0]);}
[+*()] {return (yytext[0]);}
\n {return (0);}
. {}
%%
我使用以下命令编译所有内容:
bison -d pr1.y
flex pr1.l
gcc -o result lex.yy.c pr1.tab.c -lfl -std=gnu89
我使用 -std 标志的原因是因为默认是 c99 并且 flex 和 bison 生成的代码会收到警告和错误。有什么想法吗???
您需要在 bison 输入文件 (pr1.y
) 中定义 yyerror
。并且你需要声明 yylex
否则你会得到另一个警告。
以下可以:
%{
#include <stdio.h>
void yyerror(const char* msg) {
fprintf(stderr, "%s\n", msg);
}
int yylex();
%}
如果没有你老师的机器,我不知道它是如何工作的。
此外,Mac OS X 有很旧的 bison 和 flex 版本。您可能想要升级。
查看此答案的第二条评论 post Unable to compile output of lex
在 Mac OS X 上,如果您尝试从命令行编译,则需要 link 针对 libl.a 库,使用 - ll 而不是 -lfl。显然 OS X 没有 libfl.a 库。所以试试这个...
gcc -o result lex.yy.c pr1.tab.c -ll
不知道您是否需要 -std=gnu89
选项。
我试图在我的 Mac 运行 Yosemite 上用 Flex & Bison 编译一个简单的程序,但出现以下错误:
未定义的体系结构符号x86_64: “_yyerror”,引用自: _yyparse 在 pr1-19c182.o ld:未找到体系结构符号 x86_64 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
我的两个文件看起来像这样,它们可以在我老师的 Ubuntu 安装上编译,但我无法让它们在我的 Mac:
上运行pr1.y
%{
#include <stdio.h>
%}
%%
expr : expr '+' term {printf(" + ");}
| term
;
term : term '*' fact {printf(" * ");}
| fact
;
fact : "(" expr ")"
| '0' {printf("0");}
| '1' {printf("1");}
| '2' {printf("2");}
| '3' {printf("3");}
| '4' {printf("4");}
| '5' {printf("5");}
| '6' {printf("6");}
| '7' {printf("7");}
| '8' {printf("8");}
| '9' {printf("9");}
%%
pr1.l
%{
#include "pr1.tab.h"
%}
%%
[0-9] {return (yytext[0]);}
[+*()] {return (yytext[0]);}
\n {return (0);}
. {}
%%
我使用以下命令编译所有内容:
bison -d pr1.y
flex pr1.l
gcc -o result lex.yy.c pr1.tab.c -lfl -std=gnu89
我使用 -std 标志的原因是因为默认是 c99 并且 flex 和 bison 生成的代码会收到警告和错误。有什么想法吗???
您需要在 bison 输入文件 (pr1.y
) 中定义 yyerror
。并且你需要声明 yylex
否则你会得到另一个警告。
以下可以:
%{
#include <stdio.h>
void yyerror(const char* msg) {
fprintf(stderr, "%s\n", msg);
}
int yylex();
%}
如果没有你老师的机器,我不知道它是如何工作的。
此外,Mac OS X 有很旧的 bison 和 flex 版本。您可能想要升级。
查看此答案的第二条评论 post Unable to compile output of lex
在 Mac OS X 上,如果您尝试从命令行编译,则需要 link 针对 libl.a 库,使用 - ll 而不是 -lfl。显然 OS X 没有 libfl.a 库。所以试试这个...
gcc -o result lex.yy.c pr1.tab.c -ll
不知道您是否需要 -std=gnu89
选项。