2009-09-26 235 views
8

我正在尝试使用flex和野牛来创建一个简单的脚本语言。现在,我只是想让计算器工作。未定义的引用'yylex()'

虽然我无法编译它。当我运行这个Makefile:

OBJECTS = hug.tab.o hug.yy.o 
PROGRAM = hug.exe 

CPP = g++ 
LEX = flex 
YACC = bison 

.PHONY: all clean 

all: $(OBJECTS) 
$(CPP) $^ -o $(PROGRAM) 

clean: 
$(RM) *.o *.output *.tab.* *.yy.* $(PROGRAM) 

%.tab.o: %.tab.cpp 
$(CPP) -c -o [email protected] $< 

%.tab.cpp: %.ypp 
$(YACC) -vd $< 

%.yy.o: %.yy.c 
$(CPP) -c -o [email protected] $< 

%.yy.c: %.l 
$(LEX) -o [email protected] $< 

%.o: %.cpp 
$(CPP) -c -o [email protected] $< 
我.L和.ypp文件

,我得到这个错误:

undefined reference to `yylex()' 

如果我做了命令all这样的:

$(CPP) $^ -o $(PROGRAM) -lfl 

它说它找不到-lfl。如果我这样做:

$(CPP) $^ -o -lfl $(PROGRAM) 

它会回到undefined reference错误。

对不起,我对此毫无头绪。

编辑:我有柔性安装。我尝试将其从-lfl更改为C:/GnuWin32/lib/libfl.a(我尝试使用Windows,因为Linux在我的计算机上有奇怪的问题,而我还没有Mac),但它仍然有同样的错误。

+1

您需要阅读的C/C++编译器,您使用的文档。 “-o”是生成输出文件的选项;下一个参数必须指定该文件的名称。 “-l”指定一个库;该文档将告诉您编译器将寻找这个库的命名约定和位置。作为猜测,你还没有安装flex库。 – kdgregory 2009-09-26 15:46:56

+0

我得到同样的问题。我的程序正在用gcc编译,g ++版本问题。 – Dilawar 2011-12-07 20:25:21

回答

1

你安装了flex库吗?如果是,请尝试类似于

$(CPP) $^ /path/of/flex/lib/libfl.a -o $(PROGRAM) 
+0

我已安装它。我尝试将其从-lfl更改为C:/GnuWin32/lib/libfl.a(我尝试使用Windows,因为Linux在我的计算机上有奇怪的问题,而我还没有Mac),但它仍然有同样的错误。 – Micah 2009-09-30 00:19:45

0

我附加了我的文件。

main() 
{ 
    return (yylex()) 

} 

现在它给了我一个分段错误,但我可以把它链接起来。

10

问题是你用g ++(把它当作C++)编译hug.yy.c而不是gcc。这是定义yylex的文件,因此通过将它编译为C++,最终得到一个C++ yylex函数,而其他文件正在寻找一个C yylex函数。

尝试坚持extern "C" int yylex();到您hug.l文件的第一部分,因此,它会使用C链接的函数yylex而不是C++