[英]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.