2010-05-26 92 views
0

对于C++来说相当新颖我有一个关于g ++编译器的基本问题,尤其是包含库。考虑下面的makefile:查找库的“名称”(-L -l开关)

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.alibsomething.dyn


好的,谢谢你所有的答案,它现在正在工作。 有一个小问题仍然存在:这是一个仅仅忽略“lib”还是有标准方法来查找名称的约定?

回答

7

如果您使用-l开关,则不需要lib部件。

LDLIBS=-Llibraries/jpeg-8b-bin/lib -ljpeg 
#         ^^^^ 

每当你写-lxxx,链接器将寻找一个库文件名libxxx.<ext>在所有提供的库路径。这是ld的标准惯例,对于大多数基于UNIX的链接器应该如此。

3

通常,如果您使用LDLIBS声明的第二种形式,则应该在-llibjpeg中放下字母lib以获取-ljpeg。

3

-I或-L和后面的路径之间没有空间,-lxxx暗示的lib,所以

-Llibraries/jpeg-8b-bin/lib -ljpeg 

应该做的伎俩。