Linux Debian 如何部署 Qt?
在这里以 HelloWorld
为例
目录结构如下:
.
├── HelloWorld
├── HelloWorld.sh
├── imageformats
│ ├── libqgif.so
│ ├── libqicns.so
│ ├── libqico.so
│ ├── libqjpeg.so
│ ├── libqsvg.so
│ ├── libqtga.so
│ ├── libqtiff.so
│ ├── libqwbmp.so
│ └── libqwebp.so
├── libicudata.so.56 -> libicudata.so.56.1
├── libicudata.so.56.1
├── libicui18n.so.56 -> libicui18n.so.56.1
├── libicui18n.so.56.1
├── libicuuc.so.56 -> libicuuc.so.56.1
├── libicuuc.so.56.1
├── libQt5Core.so.5 -> libQt5Core.so.5.9.5
├── libQt5Core.so.5.9.5
├── libQt5DBus.so.5 -> libQt5DBus.so.5.9.5
├── libQt5DBus.so.5.9.5
├── libQt5Gui.so.5 -> libQt5Gui.so.5.9.5
├── libQt5Gui.so.5.9.5
├── libQt5Widgets.so.5 -> libQt5Widgets.so.5.9.5
├── libQt5Widgets.so.5.9.5
├── libQt5XcbQpa.so.5 -> libQt5XcbQpa.so.5.9.5
├── libQt5XcbQpa.so.5.9.5
├── platforminputcontexts
│ ├── libcomposeplatforminputcontextplugin.so
│ ├── libfcitxplatforminputcontextplugin.so
│ ├── libibusplatforminputcontextplugin.so
│ └── libqtvirtualkeyboardplugin.so
├── platforms
│ ├── libqeglfs.so
│ ├── libqlinuxfb.so
│ ├── libqminimalegl.so
│ ├── libqminimal.so
│ ├── libqoffscreen.so
│ ├── libqvnc.so
│ └── libqxcb.so
├── platformthemes
│ └── libqgtk3.so
└── xcbglintegrations
├── libqxcb-egl-integration.so
└── libqxcb-glx-integration.so
其中 HelloWorld.sh
内容如下所示:
#!/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 "$@"
HelloWorld.sh
脚本中设置了 LD_LIBRARY_PATH
环境变量,即 ldd
脚本命令搜索的动态依赖库的路径。
然后运行以以脚本名称的一个应用(故脚本名称需要和应用名称一致
),当然你也可以在 /etc/profile
环境变量文件中自由的添加该环境变量,类似这样的LD_LIBRARY_PATH=/home/app/HelloWorld
。
也可以直接在命令行终端添加这样的语句
# 添加临时的环境变量,仅在该命令行终端有效。
export LD_LIBRARY_PATH=/home/app/HelloWorld
详细部署请自行查看
http://doc.qt.io/qt-5/linux-deployment.html
值得一提的是动态库依赖需要软链接
这里以 libQt5Core.so.5.9.5
为例
# 其中 libQt5Core.so.5 就是软链接指向 libQt5Core.so.5.9.5
├── libQt5Core.so.5 -> libQt5Core.so.5.9.5
├── libQt5Core.so.5.9.5
如果你不复制软链接到程序目录中,仅复制 libQt5Core.so.5.9.5
,使用 ldd
命令可以查看看无法需要到该动态库。
# 查看应用程序依赖
ldd HelloWorld
# 查看动态库依赖
ldd libQt5Core.so.5.9.5
如果想另外设置插件目录可以设置 QT_QPA_PLATFORM_PLUGIN_PATH
环境变量。
# 设置一个目录
export QT_QPA_PLATFORM_PLUGIN_PATH=/home/app/HelloWorld/plugins
# 设置多个目录 : 相隔即可
export QT_QPA_PLATFORM_PLUGIN_PATH=/home/app/HelloWorld/plugins:/home/app/HelloWorld:/home/app
或者使用 qt.conf
文件指定,放置到应用程序目录下即可。
[Paths]
Plugins=/path/to/plugins
查看具体加载插件信息
export QT_DEBUG_PLUGINS=1
复制动态库脚本
该脚本会复制程序依赖到运行该脚本的目录中
lddExport.sh
#!/bin/sh
# 应用程序名称
exe="HelloWorld"
# 取脚本名称
#exe=`basename $0 | sed s,.sh$,,`
#ehco $exe
# 应用程序目录
des="/home/app/HelloWorld"
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
设置 export LD_LIBRARY_PATH
环境变量会导致 segmentation fault
段错误
清除冲突动态库即可,即每个系统版本的平台依赖的库。
比如 libX11.so.6
libxcb.so.1``libXau.so.6``libXdmcp.so.6``libbsd.so.0``librt.so.1