繁体   English   中英

ld 找不到现有的库

[英]ld cannot find an existing library

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

我正在拨打 linker:

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

我该如何进一步诊断这个问题,可能出了什么问题? 我在做一些完全愚蠢的事情吗?

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

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

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

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

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

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

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

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


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

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

$ sudo apt-get install libtool

这解决了一个问题ltdl对我来说,这已经被安装为libltdl.so.7且并未发现简单地-lltdl在化妆。

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

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

例如:

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

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

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

ldconfig -v 

要验证您可以运行:

$ ldconfig -p | grep libmagic

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

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

sudo apt-get install libgmp3-dev

这会产生魔力。

解决此问题的另一种方法是安装-devel package。

如果编译器正在寻找libabc.so而你有libabc.so.1 ,你需要像libabc-devel一样安装-devel package 因为libabc.so.1是一个运行时库,而libabc.so是一个开发库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM