2013-12-20 49 views
-1

只有我的一個類(Parser)需要lcurl庫。我安裝了libcurl4-gnutls-dev。當我用g ++ class.cpp -lcurl編譯終端中的類時,它工作正常。當我嘗試將它包含在makefile中時,它不會拋出未定義的引用錯誤。 這是我的makefile,請記住只有解析器需要它。在makefile中包含-lcurl

$GPP = g++ -O3 -Wall 

UTILS = ../Utilities 
SCANNER = ../Utilities 
SCANLINE = ../Utilities 

M = Main.o 
E = Email.o 
P = Parser.o 
SL = ScanLine.o 
S = Scanner.o 
U = Utils.o 
LDFLAGS = -lcurl 

Aprog: $(M) $(E) $(P) $(SL) $(S) $(U) 
    $(GPP) -o Aprog $(M) $(E) $(P) $(SL) $(S) $(U) 

Main.o: Main.h Main.cpp 
    $(GPP) -o Main.o -c Main.cpp 

Email.o: Email.h Email.cpp 
    $(GPP) -o Email.o -c Email.cpp 

ParseText.o: ParseText.h ParseText.cpp 
    $(GPP) -o ParseText.o -c ParseText.cpp -lcurl 

ScanLine.o: $(SCANLINE)/ScanLine.h $(SCANLINE)/ScanLine.cpp 
    $(GPP) -o ScanLine.o -c $(SCANLINE)/ScanLine.cpp 

Scanner.o: $(SCANNER)/Scanner.h $(SCANNER)/Scanner.cpp 
    $(GPP) -o Scanner.o -c $(SCANNER)/Scanner.cpp 

Utils.o: $(UTILS)/Utils.h $(UTILS)/Utils.cpp 
    $(GPP) -o Utils.o -c $(UTILS)/Utils.cpp 

clean: 
    rm *.o 
    rm Aprog 
echo "Clean" 

感謝

回答

0

您運行的g ++,像這樣的 '-c' 選項:

ParseText.o: ParseText.h ParseText.cpp 
    $(GPP) -o ParseText.o -c ParseText.cpp -lcurl 

-c選項的意思是 「編譯或彙編源文件,但不鏈接。」,所以添加-lcurl根本不會做任何事情。對Curl函數的引用在ParseText.o文件中保留爲未解析的引用。

您需要在鏈接階段添加-lcurl,這是makefile中的'Aprog'規則。該規則將從各個翻譯單元(即cpp文件)中提取所有目標文件並將它們鏈接在一起,然後將鏈接添加到您指定的任何庫。

Aprog: $(M) $(E) $(P) $(SL) $(S) $(U) 
    $(GPP) -o Aprog $(M) $(E) $(P) $(SL) $(S) $(U) -lcurl 

,或者因爲你已經設置的變量LDFLAGS,你可以使用:

Aprog: $(M) $(E) $(P) $(SL) $(S) $(U) 
    $(GPP) -o Aprog $(M) $(E) $(P) $(SL) $(S) $(U) $(LDFLAGS) 
0

嘗試使用的LDLIBS = -lcurl代替LDFLAGS。如果這不起作用,請在調用gcc的末尾輸入$(LDFLAGS)

$(GPP) -o Aprog $(M) $(E) $(P) $(SL) $(S) $(U) $(LDFLAGS) 
1

你必須包括-lcurl鏈接線。在你的情況下,你指定一個明確的鏈接命令(而不是依靠默認規則),所以LDFLAGS不考慮。用途:

Aprog: $(M) $(E) $(P) $(SL) $(S) $(U) 
    $(GPP) -o Aprog $(M) $(E) $(P) $(SL) $(S) $(U) -lcurl