如何手动打包 Linux(麒麟系统)的 Qt 程序
gcc版本
gcc版本
确保目标系统(运行环境)的 GCC 版本 高于或等于开发环境的版本,否则程序无法在目标平台运行。通过
gcc -v
可查看当前版本。
cmake生成可执行文件
强烈建议在cmakelists添加设置运行时 rpath 为 $ORIGIN/…/lib(相对路径),否则可能在其他设备上运行时会报错,笔者亲身经历
# 设置运行时 rpath 为 $ORIGIN/../lib(相对路径)
set_target_properties(${PROJECT_NAME} PROPERTIESINSTALL_RPATH "$ORIGIN/../lib"BUILD_WITH_INSTALL_RPATH TRUE
)set_target_properties(${PROJECT_NAME}c PROPERTIESINSTALL_RPATH "$ORIGIN/../lib"BUILD_WITH_INSTALL_RPATH TRUE
)
附上报错截图
笔者这里以sunny450_silc
可执行文件为例,编译在工程路径下的build目录中,不会编译请自行搜索
构建打包目录
- 目录结构
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目录下
cp build/sunny450_silc package/bin/
准备程序运行库
查看所需运行库
ldd package/bin/sunny450_silc
可以根据各个库后面的路径来找对应的库,并将它们全部复制到之前创建的bin目录下,或者使用脚本复制依赖库,笔者这里用脚本.
新建复制脚本
vim cplib.sh
写入内容
#!/bin/bash
ldd ./sunny450_silc | awk '/=> \// {print $3}' | while IFS= read -r lib; doif [ -L "$lib" ]; thencp "$(readlink -f "$lib")" ../lib/elsecp "$lib" ../lib/fi
done
添加可执行权限
chmod +x package/bin/cplib.sh
执行
./cplib.sh
复制qt插件
查看qt路径
which qmake
复制
编写运行脚本
cd bin
vim run.sh
#!/bin/bash
export LD_LIBRARY_PATH=$(dirname $0)/../lib:$LD_LIBRARY_PATH
$(dirname $0)/sunny450_silc
添加可执行权限
chmod +x run.sh
运行
压缩
tar czvf sunny450_silc.tar.gz package/