linux ld找不到现有库

csbfibhn  于 2022-12-03  发布在  Linux
关注(0)|答案(9)|浏览(221)

我试图在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

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

c8ib6hqw

c8ib6hqw1#

问题是链接器正在查找libmagic.so,但您只有libmagic.so.1
一个快速的破解方法是将libmagic.so.1符号链接到libmagic.so

um6iljoc

um6iljoc2#

正如grepsedawk所阐述的,答案就在g++-l选项中,调用ld

  • g++ -l:libmagic.so.1 [...]
  • 或者:g++ -lmagic [...](如果库路径中有一个名为www.example.com的符号链接libmagic.so)
mqxuamgl

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

i5desfxk

i5desfxk4#

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

$ sudo apt-get install libtool

这为我解决了ltdl的一个问题,它被安装为libltdl.so.7,而不是简单地作为-lltdl

ccgok5k5

ccgok5k55#

如上所述,链接器正在查找libmagic.so,但您只有libmagic.so.1
要解决此问题,只需执行更新缓存。

ldconfig -v

要验证是否可以运行:

$ ldconfig -p | grep libmagic
yi0zb3m4

yi0zb3m46#

除非我弄错了,否则libmagic-lmagic与ImageMagick不是同一个库。
ImageMagick附带了一个实用程序,为编译器提供所有适当的选项。
例如:

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

ijxebb2r7#

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

w46czmvw

w46czmvw8#

我尝试了上面提到的所有解决方案,但没有一个解决了我的问题,但最后我用下面的命令解决了它。

sudo apt-get install libgmp3-dev

这会很神奇的

2ledvvac

2ledvvac9#

解决此问题的另一种方法是安装-devel包。
如果编译器正在查找libabc.so,而您有libabc.so.1,则需要安装-devel包(如libabc-devel),因为libabc.so.1是运行时库,而libabc.so是开发库。

相关问题