2008-12-03 78 views
150

我正在尝试在此Debian lenny系统上使用g ++链接应用程序。 ld抱怨它无法找到指定的库。这里的具体例子是ImageMagick,但我也遇到类似的问题。ld找不到现有的库

我与调用链接:

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 

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

回答

138

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

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

+3

的作品,我也有点困惑,它将命名默认情况下,在一个完全无用的方式文件 - 你可以提供任何见解,为什么它会做这是默认的? – maxpenguin 2008-12-03 01:09:50

+0

很可能是安装脚本的配置错误 – grepsedawk 2008-12-03 01:15:38

+5

foo.so.1也是foo.so.1.0.0的符号链接。这样,系统中可以有多个版本的库,如果应用程序需要特定的版本,则可以链接到它,而通常,最新版本是通过符号链接选择的。我不知道为什么这个符号链接丢失。 – Svante 2008-12-03 01:19:21

4

除非我弄错严重或libmagic-lmagic不是同一库ImageMagick的。你声明你想要ImageMagick。

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

例:

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

正如刚才grepsedawk制定,答案就在g++-l选项,要求ld。如果你看一下这个命令的手册页,你可以这样做:

  • g++ -l:libmagic.so.1 [...]
  • 或:g++ -lmagic [...],如果你有一个在你的库路径libmagic.so命名符号链接
30

它是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ò: Linkers and names以了解关于在Linux上如何工作的详细信息。


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

6

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

$ sudo apt-get install libtool 

这解决了与ltdl我的一个问题,已被安装为libltdl.so.7并没有发现如化妆只是-lltdl

1

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

2

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

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

ldconfig -v 

要验证你可以运行:

$ ldconfig -p | grep libmagic