只有我的一个类(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"
由于
答案 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)