2009-09-26 205 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++