ld找不到现有的库

max*_*uin 163 linux linker gcc shared-libraries shared-objects

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

我正在调用链接器:

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

ld抱怨:

/usr/bin/ld: cannot find -lmagic
Run Code Online (Sandbox Code Playgroud)

然而,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
Run Code Online (Sandbox Code Playgroud)

我如何进一步诊断这个问题,哪些可能是错的?我做的事情完全是愚蠢的吗?

gre*_*awk 154

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

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

  • libmagic.so.1是动态链接器使用的soname; libmagic.so由链接器使用,通常与-dev包中的头文件一起使用.由于未安装-dev软件包,因此可能缺少符号链接. (45认同)
  • 我有同样的问题...而不是做"黑客"我安装了"*-devel"版本,它修复了编译. (12认同)
  • foo.so.1也是foo.so.1.0.0的符号链接.这样,您可以在系统中拥有多个版本的库,如果应用程序需要特定的版本,它可以链接到它,而一般来说,最新的一个是由符号链接选择的.我不知道为什么这个符号链接丢失了. (5认同)
  • 如何将libmagic.so.1符号链接到libmagic.so?在哪里可以找到那些"开发"套餐 (4认同)
  • 这是有效的,我有点困惑,默认情况下它会以完全无用的方式命名文件 - 你能提供任何见解,为什么它会默认执行此操作? (3认同)

Pio*_*cki 66

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

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


eph*_*ent 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,这就是开发所需的原因.

请参阅DiegoE.Pettenò:链接器和名称,了解有关这一切如何在Linux上运行的详细信息.


总之,你应该apt-get install libmagic-dev.这不仅会给你libmagic.so以及编译所需的其他文件/usr/include/magic.h.


Mr *_* Ed 7

在Ubuntu中,您可以安装libtool哪些自动解析库.

$ sudo apt-get install libtool
Run Code Online (Sandbox Code Playgroud)

这解决了ltdl我的问题,这个问题已经安装为libltdl.so.7并且-lltdl在make中没有找到.


小智 5

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

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

ldconfig -v 
Run Code Online (Sandbox Code Playgroud)

要验证您可以运行:

$ ldconfig -p | grep libmagic
Run Code Online (Sandbox Code Playgroud)