找到库的“名称”(-L -l开关)

时间:2010-05-26 08:38:42

标签: c++ compiler-construction g++ command-line-arguments

作为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.alibsomething.dyn的名称?


好的,谢谢你的所有答案,它现在正在运作。 一个小问题仍然存在:简单地省略“lib”或者是否有标准化的方法来找出这个名称是一种惯例吗?

3 个答案:

答案 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

应该这样做。