ld找不到现有的库


169

我正在尝试在此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

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

Answers:


158

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

一个快速的技巧是符号链接libmagic.so.1libmagic.so


3
的效果,我有点困惑,默认情况下它将以完全无用的方式命名文件-您能否提供任何见解,为什么默认情况下会这样做?
maxpenguin

5
foo.so.1也是foo.so.1.0.0的符号链接。这样,您可以在系统中拥有一个库的多个版本,并且如果应用程序需要特定的库,则可以链接到该库,而通常,最新的库是由symlink选择的。我不知道为什么这个符号链接丢失了。
斯万特

46
libmagic.so.1是由动态链接器使用的soname。libmagic.so由链接器使用,通常与-dev包中的标头一起使用。由于未安装-dev软件包,因此可能缺少符号链接。
CesarB

13
我遇到了同样的问题……我没有安装“ * -devel”版本,而是修复了编译问题,而不是进行“ hack”操作。
Trevor Boyd Smith

4
如何将libmagic.so.1链接到libmagic.so?以及在哪里可以找到这些“开发”包
Black

68

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

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

或总而言之,lib使用时链接时请删除前缀-l-llibmagic应该是-lmagic
phyatt

31

按照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,这就是开发需要它的原因。

请参阅Diego E.Pettenò:链接器和名称,以获取有关Linux上所有这些工作原理的详细信息。


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


7

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

$ sudo apt-get install libtool

ltdl对我来说解决了一个问题,该问题是安装时libltdl.so.7发现的,而不仅仅是-lltdl在make中发现的。


它没有解决错误 就不能很好-LGL。您能否提供更多有关libtool的功能以及它如何解决库问题的信息?
Shahryar Saljoughi

4

除非我犯了个严重错误libmagic-lmagic与ImageMagick不同的库。您声明需要ImageMagick。

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

例如:

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


1

从Ubuntu存储库安装libgl1-mesa-dev对我来说解决了这个问题。


5
当然,您不会在2008
遇到

它解决了我的问题。能请您提供更多信息吗?以及它如何解决这个问题?(我的意思是:libgl1-mesa-dev)。谢谢
Shahryar Saljoughi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.