Linux程序在运行时找不到共享库

13

我正在尝试编译一个Linux程序id3v2,但它说找不到相应的库:

id3v2: error while loading shared libraries: libid3-3.8.so.3: cannot open shared object file: No such file or directory

我猜这部分是导入lidid3库的代码?

文件确实存在,然而他们要找的实际上是一个符号链接:

"ibid3-3.8.so.3.0.0"

我在想这是否是无法追踪符号链接的问题?如果我知道在哪里更改它,也许我可以手动更改为寻找0.0版本。

我很乐意澄清任何细节。

看起来包含方式如下:

id3v2:  convert.o list.o id3v2.o genre.o
        ${CXX} ${LDFLAGS} -pedantic -Wall -g -o $@ $^ -lz -lid3

我能够使用Simon的建议找出有多个可能存在库文件的地方,我在程序链接到实际文件的位置创建了一个符号链接。

感谢Simon!


1
你的标题是关于头文件的,但是你的问题显然是关于运行时共享库的 :-/. 你可以检查一下,如果将包含符号链接的目录添加到LD_LIBRARY_PATH环境变量中是否有效。 - Tony Delroy
我明显不明白我在做什么。我会尝试阅读您的声明并看看能否按照您的建议去做。 - Scott
这可能很有前途...https://dev59.com/73A75IYBdhLWcg3wFEoI - Scott
6
你是否尝试以root用户身份运行ldconfig命令?这个程序会为可用的库创建一个注册表,用于运行时库加载。诀窍在于库必须放置在ldconfig期望看到它的位置,这取决于发行版。库目录的列表通常位于/etc/ld.so.conf或类似位置。 - Alex
我刚刚以root身份运行了ldconfig。没有变化。但现在我知道它的存在了! - Scott
3个回答

35

只要符号链接的最终目标存在并且可访问,库上的符号链接就可以正常工作。

您已经构建了一个动态链接的可执行文件,希望在执行时链接到libid3-3.8.so.3。这可能是在构建阶段使用类似于-L/path/to/libid3/directory -lid3 的东西进行链接的。

一般而言,以下是使libid3可用的几种选项(由于您没有提到文件在哪里,我只能是一般性的):

  • /etc/ld.so.conf(或/lib/usr/lib)中列出的目录中创建到libid3*的符号链接
  • libid3*复制到/etc/ld.so.conf(或/lib/usr/lib)列出的目录中(默认值)
  • 将包含libid3*的目录添加到/etc/ld.so.conf
  • 在运行id3v2可执行文件之前设置LD_LIBRARY_PATH=/directory/path/to/libid3*
  • 重新以静态方式编译id3v2。(它能够工作,但不要费心。)

在执行前3个选项之后,重新运行ldconfig以便更新链接器缓存。(然后可以运行ldconfig -v来验证它是否可解析。)

请注意,这些不是步骤,而是选项。您只需要执行其中的一个。

很高兴你更新了标题。#include指令与链接无关。


是的,我从来没有使用过编译语言。我肯定会多次阅读你写的所有内容。再次感谢。 - Scott
你有任何想法吗,我该如何找出它期望文件在哪里? - Scott
1
它可以在/etc/ld.so.conf列出的任何目录中或默认的/lib/usr/lib中。可执行文件通常只有一个库文件名引用而没有路径。运行时链接器(通常是/lib/ld.so/lib/ld-linux.so,带有一些版本号)检查其配置的所有目录以获取库,然后每次程序启动时都将其链接。如果你告诉我你的 libid3-3.8.so.3 文件所在的路径,我可以给你精确的命令。 - Sdaz MacSkibbons
提示:id3v2的源目录可能仍然存在。 - Sdaz MacSkibbons
好的。我可以确定告诉您我正在寻找的文件在哪里... "/usr/local/lib/libid-3.8.so.3.0.0" 和 "/usr/local/lib/libid-3.8.so.3" Linux说 "libid3-3.8.so.3: 符号链接到 `libid3-3.8.so.3.0.0'"。 - Scott
显示剩余4条评论

6

我遇到了和你一样的错误,经过阅读这里提到的解决方案,我(在Ubuntu 8上)成功解决了问题:

sudo ln -s /usr/local/lib/libid3-3.8.so.3 /usr/lib/libid3-3.8.so.3

2

这个问题可以通过将/usr/local/lib添加到/etc/ld.so.conf中来解决(除非它已经在那里;只需放置一次),然后运行ldconfig


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接