我正试图将Qt5作为我的源代码树的一部分,所以我没有在我的机器上安装它,只是从源代码管理中复制了它。当我尝试运行uic.exe时遇到问题:
stiopa@stiopa-VirtualBox:~/ct/LinuxLibs/Qt/bin > ./uic
./uic: error while loading shared libraries: libQt5Core.so.5: cannot open shared object file: No such file or directory
即使将libQt5Core库复制到bin目录,我仍然会收到同样的错误。uic是如何寻找共享库的?我需要设置任何环境变量来修复它吗?
这是另一种不将依赖共享库放在程序支持的定义位置的情况。
如果您计划执行"将文件复制到与可执行文件相同的目录",快速解决方案是引用库加载路径中的目录;例如,如果二进制文件在$HOME/foo
中,则执行:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}${LD_LIBRARY_PATH:+:}$HOME/foo
这将添加或使$HOME/foo
成为运行时链接器的加载路径。因此,您运行的任何程序都将在此目录中查找库,以及操作系统的默认设置(由ld.so
配置定义),以及应用程序本身(rpath
)中定义的路径。
如果你要遵循这条路线,你可以做的是将二进制文件移动到target.bin,创建一个目标bash脚本,它会自动调用bin文件;例如
#!/bin/bash -p
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}${LD_LIBRARY_PATH:+:}$(dirname $0)
exec $0.bin "$*"
一种辅助机制,允许您更改二进制文件的搜索位置;在不需要环境变量插入的情况下,就是修改二进制文件,使其在不同的位置进行搜索;这利用了运行时链接器(查找库)中的一些功能。
有一个名为chrpath的程序,可以由各种包管理器添加,它允许您直接编辑rpath。在这种情况下;您可以使用更改二进制文件的附加搜索路径
chrpath -r '$ORIGIN' foo
这意味着程序将在与.so
文件的二进制文件相同的目录中查找,从而允许它运行。