序言
Qt在windows上有自带的windeployqt来帮助打包程序,但是对于linux系统来说Qt并没有自带对应的打包程序。尽管存在开源的linuxdeployqt打包程序,但是在使用的过程中会出现很多问题,对于arm架构的系统来说需要编译并修改源码等等。 综上所述,手动打包不失为一种更好的选择。
准备
首先要确认程序运行的目标环境gcc版本要高于你开发环境的gcc版本,否者就算打包了也无法运行。可以通过gcc -v来查看对应的版本:
接下来需要一个已经编译好的运行程序,如果不知道怎么编译程序可以查看如何将windows的程序移植到麒麟系统上编译
创建软件目录
首先我们要创建一个程序目录,目录结构如下:
package/
├── bin/
│ ├── run.sh # 启动脚本
│ └── app # 程序的可执行文件
├── lib/
│ ├── libQt5Core.so.5 # 依赖库 (例如 Qt 库)
│ ├── libQt5Gui.so.5 # 依赖库
│ ├── libQt5Widgets.so.5
│ ├── libstdc++.so.6 # 其他依赖库
│ └── ... # 其他库
├── plugins/ # Qt 插件目录
│ ├── platforms/
│ │ └── libqxcb.so # 平台插件 (用于 GUI 应用的 X11 支持)
│ └── ... # 其他可能的插件
└── resources/ # 资源文件(可选)
└── icon.png # 图标或其他资源文件
首先进入你编译好的程序文件夹,执行命令
mkdir -p package/{bin,lib,plugins}
运行完成后可以看到系统创建了对应的目录:
复制你的可执行程序到bin目录下(将 your_executable
替换为你的可执行文件名):
cp ./your_executable package/bin/
准备程序运行库
使用以下命令来查看你可执行程序所需要的运行库:
ldd ./your_executable
可以看到控制台输出:
你可以根据各个库后面的路径来找到对应的库,并将它们全部复制到之前创建的lib目录下。或者使用 rsync
复制依赖库(将 your_executable
替换为你的可执行文件名)
ldd ./your_executable | grep "=> /" | awk '{print $3}' | xargs -I '{}' rsync -av '{}' package/lib/
复制完成后可以再执行一次ldd命令来对比一下程序依赖库是否全部复制完成。复制完成后如下:
复制Qt插件
确定你程序所需要的插件,然后将你使用的Qt版本对应的插件复制到plugins里边。我这里为了方便把所有的插件都复制过来了,全部插件也不大。例如我这里用的是Qt5.7.0版本:
编写运行脚本
为了确保程序在运行时能找到这些库,你需要在运行时设置 LD_LIBRARY_PATH
环境变量。创建一个脚本文件 run.sh并放到bin目录下
:
nano package/bin/run.sh
添加如下内容:
#!/bin/bash
export LD_LIBRARY_PATH=$(dirname $0)/../lib:$LD_LIBRARY_PATH
$(dirname $0)/your_executable
将 your_executable
替换为你的可执行文件名。保存并关闭文件,然后给脚本文件添加执行权限:
chmod +x package/bin/run.sh
完成后bin目录下文件如下:
测试
接下来可以直接运行run.sh脚本来测试程序是否运行成功。
压缩打包
最后,将 package
目录压缩为一个 .tar.gz
包或其他格式的包,方便分发:
tar czvf your_application.tar.gz package/
大功告成!