ld找不到现有的库
我试图在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制定的,答案在于g++
的-l
选项,调用ld
。 如果你看看这个命令的手册页,你可以做:
-
g++ -l:libmagic.so.1 [...]
- 或:
g++ -lmagic [...]
,如果在libspath中有一个名为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
,所以这是embedded到可执行文件中的string,所以这是运行可执行文件时加载的文件。
但是,因为库指定为链接器的-lmagic
,所以它会查找libmagic.so
,这就是为什么它需要进行开发。
请参阅Diego E.Pettenò:关于如何在Linux上运行的详细信息, 链接器和名称 。
总之,你应该apt-get install libmagic-dev
。 这不仅会给你libmagic.so
而且还会编译像/usr/include/magic.h
所需的其他文件。
在Ubuntu中,您可以安装自动parsing库的libtool
。
$ sudo apt-get install libtool
这解决了我的一个问题,它已经被安装为libltdl.so.7
,在make中没有find简单的-lltdl
。
除非我错误地将libmagic
或-lmagic
与ImageMagick不同。 你声明你想要ImageMagick。
ImageMagick附带了一个实用程序来为编译器提供所有适当的选项。
例如:
g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"
如上所述,链接器正在寻找libmagic.so
,但只有libmagic.so.1
。
要解决这个问题,只需执行更新caching。
ldconfig -v
要validation您可以运行:
$ ldconfig -p | grep libmagic
从Ubuntu回购安装libgl1-mesa-dev为我解决了这个问题。