Ld 找不到现有库

我试图在这个 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

我该如何进一步诊断这个问题,会出什么问题呢? 我是不是做了什么完全愚蠢的事情?

723566 次浏览

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

一个快速黑客是符号链接 libmagic.so.1libmagic.so

除非我大错特错,否则 libmagic-lmagic与 ImageMagick 不是同一个库。

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

例如:

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

正如 gre假设的那样,答案在于 g++-l选项,调用 ld。如果查看此命令的手册页,可以执行以下操作:

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

按照 Debian 惯例,将共享库分为运行时组件(libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0)和开发组件(libmagic-dev: /usr/lib/libmagic.so → …)。

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

但是,由于该库被指定为链接器的 -lmagic,因此它将查找 libmagic.so,这就是为什么开发需要它的原因。

有关这一切在 Linux 上如何工作的详细信息,请参阅 Diego E. Pettenò: 链接者和名字


简而言之,你应该 apt-get install libmagic-dev。这样不仅可以得到 libmagic.so,还可以得到编译所需的其他文件,比如 /usr/include/magic.h

在 Ubuntu 中,你可以安装自动解析库的 libtool

$ sudo apt-get install libtool

这为我解决了 ltdl的一个问题,它被安装为 libltdl.so.7,而不是在 make 中发现的简单的 -lltdl

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

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

要解决这个问题,只需执行一个更新缓存。

ldconfig -v

要验证可以运行:

$ ldconfig -p | grep libmagic

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

sudo apt-get install libgmp3-dev

这个会有奇效的。

解决这个问题的另一种方法是安装 -devel包。

如果编译器在使用 libabc.so.1时寻找 libabc.so,则需要安装类似于 libabc-devel-devel包,因为 libabc.so.1是运行时库,而 libabc.so是开发库。