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

问题描述 投票:0回答:3

作为 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 条目并激活第二个 LDLIBS 条目,我会得到

ld: library not found for -llibjpeg
。我认为我的
libjpeg.a
只是不叫
libjpeg
,而是有一些不同的名称。

有没有办法找出给定“库文件”的名称

libsomething.a
libsomething.dyn


好的,感谢您的所有回答,现在可以使用了。 仍然存在一个小问题:简单地省略“lib”是一种约定,还是有一种标准化的方法来查找名称?

c++ g++ command-line-arguments
3个回答
9
投票

如果您使用

lib
开关,则不需要
-l
部分。

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

每当您写入

-lxxx
时,链接器都会在所有提供的库路径中查找文件名为
libxxx.<ext>
的库。这是
ld
的标准约定,对于大多数基于 UNIX 的链接器来说应该是正确的。


3
投票

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


3
投票

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

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

应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.