在makefile中包含-lcurl

时间:2013-12-20 21:55:24

标签: c++ unix curl

只有我的一个类(Parser)需要lcurl库。我安装了libcurl4-gnutls-dev。当我使用g ++ class.cpp -lcurl在终端中编译一个类时,它工作正常。当我尝试将它包含在makefile中时,它不会抛出未定义的引用错误。 这是我的makefile,请记住只有Parser需要它。

$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"

由于

3 个答案:

答案 0 :(得分:1)

您必须在{em>链接行中添加-lcurl。在您的情况下,您指定了显式链接命令(而不是依赖于默认规则),因此不会考虑LDFLAGS。使用:

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

答案 1 :(得分:0)

尝试使用LDLIBS = -lcurl代替LDFLAGS。如果这不起作用,请将$(LDFLAGS)放在gcc调用的末尾。

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

答案 2 :(得分:0)

使用'-c'选项运行g ++,如下所示:

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)