在Ubuntu上,通过运行lddmyapp可以查看应用程序依赖的动态链接库,在=>后显示”notfound”的动态链接库就是需要复制的动态链接库,例如:
libQt5Widgets.so.5=>not found
将缺失的动态库复制到应用程序目录后,由于实际的动态库名称与应用程序所需的名称不一致,还需要通过建立软链接实现应用程序与动态链接库的链接,比如libQt5Core.so.5建立指向libQt5Core.so.5.1.0的软链接,在应用程序目录下执行下面的命令:
ln-s $PWD/libQt5Core.so.5.1.0 libQt5Core.so.5
所有动态库的软链接建立之后,执行下面的命令使应用程序目录成为系统动态库路径:
exportset LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH
再次运行ldd myapp显示所有动态库都已经关联,运行myapp报错
Failedto load platform plugin “xcb”. Available platforms are:
Aborted(coredumped)
这是缺少平台信息,需要将安装目录/opt/Qt5.1.0/5.1.0/gcc/plugins/platforms文件夹复制到应用程序所在目录下,执行应用程序仍然报错
Failedto load platform plugin “xcb”.Available platforms are:
linuxfb
minimal
xcb
Aborted(core dumped)
这时通过命令exportQT_DEBUG_PLUGINS=1,再运行./myapp可以将QT的调试信息打印出来,可以看到实际上还缺少一个动态库,导致libqxcb.so不能加载:
同样复制这个动态库到应用程序目录下,建立好软链接,就能执行应用程序了。
下面是某个应用程序建立软链接的命令,以及相关的动态库名和链接名:
ln-s $PWD/libQt5DBus.so.5.1.0libQt5DBus.so.5
ln-s $PWD/libQt5Core.so.5.1.0libQt5Core.so.5
ln-s $PWD/libQt5Gui.so.5.1.0 libQt5Gui.so.5
ln-s $PWD/libQt5Widgets.so.5.1.0libQt5Widgets.so.5
ln-s $PWD/libQt5Xml.so.5.1.0 libQt5Xml.so.5
ln-s $PWD/libicudata.so.49.1.2libicudata.so.49
ln-s $PWD/libicui18n.so.49.1.2libicui18n.so.49
ln-s $PWD/libicuuc.so.49.1.2 libicuuc.so.49
为了避免每次运行前设置LD_LIBRARY_PATH环境变量,可以通过编写一个脚本来启动应用程序
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}"!= "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
将这个脚本保存为myapp.sh,并且放在应用程序同一目录下,只要运行这个脚本就能执行应用程序了。