加载共享库时的 Linux 错误:无法打开共享对象文件:没有这样的文件或目录

新手上路,请多包涵

程序是 Xenomai 测试套件的一部分,从 Linux PC 交叉编译到 Linux+Xenomai ARM 工具链。

 # echo $LD_LIBRARY_PATH
/lib
# ls /lib
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so
ld-linux.so.2       libdl.so.2          libpthread.so.0
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so
libc.so.6           libgcc_s.so.1       libstdc++.so.6
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9
libcrypt.so.1       libm.so.6
# ./clocktest
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory

.1 在文件名的末尾吗?这到底是什么意思?

原文由 zaratustra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

更新

虽然我在下面写的作为关于共享库的一般答案是正确的,但我认为这类消息的最常见原因是因为您已经安装了一个包,但没有安装该包的 -dev 版本.


好吧,这不是说谎 - 该列表中没有 libpthread_rt.so.1 。您可能需要重新配置和重新构建它,以便它取决于您拥有的库,或者安装提供的任何东西 libpthread_rt.so.1

一般来说,.so后面的数字是版本号,你会经常发现它们是相互的符号链接,所以如果你有libfoo.so的1.1版本,你就会有一个真实的文件libfoo.so.1.0,并且符号链接 foo.so 和 foo.so.1 指向 libfoo.so.1.0。如果您安装 1.1 版本而不删除另一个版本,您将拥有一个 libfoo.so.1.1,并且 libfoo.so.1 和 libfoo.so 现在将指向新版本,但任何需要该确切版本的代码都可以使用 libfoo.so.1.0 文件。仅依赖于版本 1 API,但不关心它是 1.0 还是 1.1 的代码将指定 libfoo.so.1。正如 orip 在评论中指出的那样,这 在这里 得到了很好的解释。

在您的情况下,您 可能 会摆脱符号链接 libpthread_rt.so.1libpthread_rt.so 。但是,不能保证它不会破坏您的密码并吃掉您的电视晚餐。

原文由 Paul Tomblin 发布,翻译遵循 CC BY-SA 4.0 许可协议

您的库是一个动态库。您需要告诉操作系统它可以在运行时找到它的位置。

为此,我们需要执行以下简单步骤:

  1. 如果您不知道,请查找图书馆的放置位置。
    sudo find / -name the_name_of_the_file.so

  1. 检查动态库路径环境变量是否存在( LD_LIBRARY_PATH
    echo $LD_LIBRARY_PATH

如果没有要显示的内容,请添加默认路径值(如果您愿意,也可以不添加)

    LD_LIBRARY_PATH=/usr/local/lib

  1. 我们添加所需的路径,将其导出并尝试应用程序。

注意路径应该是 path.so.something 所在的目录。因此,如果 path.so.something/my_library/path.so.something 中,它应该是:

    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
   export LD_LIBRARY_PATH
   ./my_app

参考来源

原文由 XOR 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题