作为C ++的新手我有一个基本关于g ++编译器的问题,特别是包含库。请考虑以下makefile:
CPPFLAGS= -I libraries/boost_1_43_0-bin/include/ -I libraries/jpeg-8b-bin/include/
LDLIBS= libraries/jpeg-8b-bin/lib/libjpeg.a
# LDLIBS= -L libraries/jpeg-8b-bin/lib -llibjpeg
all: main
main: main.o
c++ -o main main.o $(LDLIBS)
main.o: main.cpp
c++ $(CPPFLAGS) -c main.cpp
clean:
rm -rf *.o main
如您所见,我将LDLIBS变量声明了两次。如果我使用上面的makefile,我的代码正在编译和工作。但是如果我停用第一个LDLIBS条目并激活第二个条目,我会得到ld: library not found for -llibjpeg
。我假设我的libjpeg.a
没有被称为libjpeg
但是有一些不同的名字。
有没有办法找出给定“库文件”libsomething.a
或libsomething.dyn
的名称?
好的,谢谢你的所有答案,它现在正在运作。 一个小问题仍然存在:简单地省略“lib”或者是否有标准化的方法来找出这个名称是一种惯例吗?
答案 0 :(得分:8)
如果您使用lib
开关,则不需要-l
部分。
LDLIBS=-Llibraries/jpeg-8b-bin/lib -ljpeg
# ^^^^
每当您编写-lxxx
时,链接器将在所有提供的库路径中查找文件名为libxxx.<ext>
的库。这是ld
的标准约定,对于大多数基于UNIX的链接器应该是正确的。
答案 1 :(得分:3)
通常,如果您使用第二种形式的LDLIBS声明,则应删除-llibjpeg中的字母lib以获取-ljpeg。
答案 2 :(得分:3)
-I或-L与后面的路径之间没有空格,-lxxx表示lib,所以
-Llibraries/jpeg-8b-bin/lib -ljpeg
应该这样做。