ld找不到现有的库

时间:2008-12-03 00:41:51

标签: linux gcc linker shared-libraries shared-objects

我试图在这个Debian lenny系统上将应用程序与g ++链接起来。 ld抱怨它无法找到指定的库。这里的具体示例是ImageMagick,但我也遇到了类似的问题。

我用以下方法调用链接器:

g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic

ld抱怨:

/usr/bin/ld: cannot find -lmagic

然而,libmagic存在:

$ locate libmagic.so
/usr/lib/libmagic.so.1
/usr/lib/libmagic.so.1.0.0
$ ls -all /usr/lib/libmagic.so.1*
lrwxrwxrwx 1 root root    17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
-rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0
$ ldd /usr/lib/libmagic.so.1.0.0 
    linux-gate.so.1 =>  (0xb7f85000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
    /lib/ld-linux.so.2 (0xb7f86000)
$ sudo ldconfig -v | grep "libmagic"
    libmagic.so.1 -> libmagic.so.1.0.0

如何进一步诊断此问题,可能出现什么问题?我做的事情完全是愚蠢的吗?

8 个答案:

答案 0 :(得分:150)

问题是链接器正在寻找libmagic.so,但您只有libmagic.so.1

快速破解是将libmagic.so.1符号链接到libmagic.so

答案 1 :(得分:65)

正如grepsedawk所阐述的那样,答案在于-l的{​​{1}}选项,调用g++。如果查看此命令的手册页,您可以执行以下操作:

  • ld
  • 或:g++ -l:libmagic.so.1 [...],如果你的libs路径中有一个名为libmagic.so的符号链接

答案 2 :(得分:31)

将共享库分离为其运行时组件(libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0)及其开发组件(libmagic-dev: /usr/lib/libmagic.so → …)是Debian约定。

因为库的soname是libmagic.so.1,所以这是嵌入到可执行文件中的字符串,这是运行可执行文件时加载的文件。

但是,因为库被指定为链接器的-lmagic,所以它会查找libmagic.so,这就是开发所需的原因。

有关这一切在Linux上如何运作的详细信息,请参阅Diego E. Pettenò: Linkers and names


简而言之,您应该apt-get install libmagic-dev。这不仅会为您提供libmagic.so,还会为您提供编译所需的其他文件,例如/usr/include/magic.h

答案 3 :(得分:7)

在Ubuntu中,您可以安装libtool自动解析库。

$ sudo apt-get install libtool

这解决了我ltdl的问题,该问题已安装为libltdl.so.7,并且在make中找不到简单的-lltdl

答案 4 :(得分:4)

除非我误解为libmagic-lmagic与ImageMagick不是同一个库。你声明你想要ImageMagick。

ImageMagick附带了一个实用程序,可为编译器提供所有适当的选项。

例如:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"

答案 5 :(得分:3)

如上所述,链接器正在寻找libmagic.so,但您只有libmagic.so.1

要解决此问题,只需执行更新缓存即可。

ldconfig -v 

验证您可以运行:

$ ldconfig -p | grep libmagic

答案 6 :(得分:1)

从Ubuntu repo安装libgl1-mesa-dev为我解决了这个问题。

答案 7 :(得分:0)

我尝试了上面提到的所有解决方案,但没有一个解决了我的问题,但最终我使用以下命令解决了它。

sudo apt-get install libgmp3-dev

这会变魔术。