我试图在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
我如何进一步诊断这个问题,可能出了什么问题?我是不是在做完全愚蠢的事情?
9条答案
按热度按时间c8ib6hqw1#
问题是链接器正在查找
libmagic.so
,但您只有libmagic.so.1
一个快速的破解方法是将
libmagic.so.1
符号链接到libmagic.so
um6iljoc2#
正如grepsedawk所阐述的,答案就在
g++
的-l
选项中,调用ld
。g++ -l:libmagic.so.1 [...]
g++ -lmagic [...]
(如果库路径中有一个名为www.example.com的符号链接libmagic.so)mqxuamgl3#
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
。i5desfxk4#
在Ubuntu中,您可以安装
libtool
,它会自动解析库。这为我解决了
ltdl
的一个问题,它被安装为libltdl.so.7
,而不是简单地作为-lltdl
。ccgok5k55#
如上所述,链接器正在查找
libmagic.so
,但您只有libmagic.so.1
。要解决此问题,只需执行更新缓存。
要验证是否可以运行:
yi0zb3m46#
除非我弄错了,否则
libmagic
或-lmagic
与ImageMagick不是同一个库。ImageMagick附带了一个实用程序,为编译器提供所有适当的选项。
例如:
ijxebb2r7#
从Ubuntu repo安装libgl 1-mesa-dev为我解决了这个问题。
w46czmvw8#
我尝试了上面提到的所有解决方案,但没有一个解决了我的问题,但最后我用下面的命令解决了它。
这会很神奇的
2ledvvac9#
解决此问题的另一种方法是安装
-devel
包。如果编译器正在查找
libabc.so
,而您有libabc.so.1
,则需要安装-devel
包(如libabc-devel
),因为libabc.so.1
是运行时库,而libabc.so
是开发库。