我试图在这个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
我如何进一步诊断这个问题,哪些可能是错的?我做的事情完全是愚蠢的吗?
问题是链接器正在寻找libmagic.so
但你只有libmagic.so.1
一个快速的黑客是符号链接libmagic.so.1
到libmagic.so
正如grepsedawk所提出的那样,答案在于-l
选择g++
,调用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约定.
因为库的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
在make中没有找到.