为什么`ldd` 输出“??? => ???” (图书馆和地点都有问号)?

为什么`ldd` 输出“??? => ???” (图书馆和地点都有问号)?

运行时ldd <dynamic_lib>,我注意到有一些条目显示为??? => ???.通过搜索引擎和本网站搜索“Linux”、“ ldd”和“ ”的各种组合??? => ???都没有找到任何结果。

可能相关:所讨论的动态库是使用内置 GCC 套件在 Windows 10 上的 MSYS2 下编译的。

答案1

ldd命令尝试将可执行文件或库链接到系统中的共享库,就像您运行/使用它时一样。它将从给定文件中读取库引用,并尝试在您的文件系统和路径 ( ) 中找到它们LD_LIBRARY_PATH。如果它显示“ ???”,那么这意味着它在您的系统中找不到某些库(并且您检查过的程序/库可能无法运行/可用)。

当您将文件(可执行文件或共享对象库)从一个系统复制到另一个系统时,通常会遇到库问题。原因是系统库不同 - 即使这些库仅因版本不同而存在。

有时,解决方案是也复制丢失的库,并将它们放在LD_LIBRARY_PATH.您还可以为此目的设置该变量,或者附加一个新文件夹,因为您不想将这些复制的库文件安装到您的系统中(!)。

ldd您可以通过在原始系统上运行来找出要复制的库。

如果这是您自己的程序或者您自己编译了它,您实际上可能知道缺少哪些库。

一旦您确定了您的库,您可以将它们复制到个人文件夹中,例如复制到~/libs.然后将此文件夹添加到您的库路径中:

export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}":~/libs

如果变量已经存在(通过 测试echo $LD_LIBRARY_PATH),或者

export LD_LIBRARY_PATH=~/libs

如果没有(两种bash风格的 shell 语法)。

然后,再试ldd一次。

稍后,您可以始终使用设置变量的 shell 脚本来启动实际程序,然后启动程序。

答案2

对于那些在 MSYS2 下的 Windows 上遇到相同问题的人(使用 GCC Suite 编译共享库,将可执行文件链接到该库,然后发现运行时缺少依赖项),您可以:

  1. 将共享库复制到与可执行文件相同的目录。
  2. 从与可执行文件相同的目录链接到共享库。
  3. 修改路径环境变量以包含包含共享库的目录。

MSYS2可以在Windows上提供类似Unix的环境,但是我们仍然需要遵循Windows在运行时搜索可执行文件(包括共享库)的方式(简而言之,LD_LIBRARY_PATH没有意义,链接器不关心提供的路径)应使用 rpath;

相关内容