运行时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 编译共享库,将可执行文件链接到该库,然后发现运行时缺少依赖项),您可以:
- 将共享库复制到与可执行文件相同的目录。
- 从与可执行文件相同的目录链接到共享库。
- 修改路径环境变量以包含包含共享库的目录。
MSYS2可以在Windows上提供类似Unix的环境,但是我们仍然需要遵循Windows在运行时搜索可执行文件(包括共享库)的方式(简而言之,LD_LIBRARY_PATH没有意义,链接器不关心提供的路径)应使用 rpath;