在 makefile 中包含 -lcurl

Including -lcurl in makefile

本文关键字:-lcurl 包含 makefile      更新时间:2023-10-16

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

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

谢谢

您必须在

链接行中包含-lcurl。在您的情况下,您指定一个显式链接命令(而不是为此依赖默认规则),因此不考虑LDFLAGS。用:

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

你用'-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)
<</div> div class="answers">

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

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