如何手动打包 Linux(麒麟系统)的 Qt 程序

gcc版本

gcc版本

确保目标系统(运行环境)的 GCC 版本 高于或等于开发环境的版本,否则程序无法在目标平台运行。通过 gcc -v 可查看当前版本。

cmake生成可执行文件

强烈建议在cmakelists添加设置运行时 rpath 为 $ORIGIN/.../lib(相对路径),否则可能在其他设备上运行时会报错,笔者亲身经历

plain 复制代码
# 设置运行时 rpath 为 $ORIGIN/../lib(相对路径)
set_target_properties(${PROJECT_NAME} PROPERTIES
        INSTALL_RPATH "$ORIGIN/../lib"
        BUILD_WITH_INSTALL_RPATH TRUE
)

set_target_properties(${PROJECT_NAME}c PROPERTIES
        INSTALL_RPATH "$ORIGIN/../lib"
        BUILD_WITH_INSTALL_RPATH TRUE
)

附上报错截图

笔者这里以sunny450_silc可执行文件为例,编译在工程路径下的build目录中,不会编译请自行搜索

构建打包目录

  1. 目录结构
plain 复制代码
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        # 图标或其他资源文件
  1. 建议放到工程路径下
plain 复制代码
mkdir -p package/{bin,lib,plugins}
  1. 复制可执行程序到bin目录下
plain 复制代码
cp build/sunny450_silc package/bin/

准备程序运行库

查看所需运行库

plain 复制代码
ldd package/bin/sunny450_silc

可以根据各个库后面的路径来找对应的库,并将它们全部复制到之前创建的bin目录下,或者使用脚本复制依赖库,笔者这里用脚本.

新建复制脚本

vim cplib.sh

写入内容

plain 复制代码
#!/bin/bash
ldd ./sunny450_silc | awk '/=> \// {print $3}' | while IFS= read -r lib; do
    if [ -L "$lib" ]; then
        cp "$(readlink -f "$lib")" ../lib/
    else
        cp "$lib" ../lib/
    fi
done

添加可执行权限

chmod +x package/bin/cplib.sh

执行

./cplib.sh

复制qt插件

查看qt路径

which qmake

复制

编写运行脚本

cd bin

vim run.sh

plain 复制代码
#!/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/

相关推荐
hhb_6181 小时前
Linux底层运维自动化挂载与磁盘分区实战指南
linux·运维·自动化
cui_ruicheng2 小时前
Linux库制作与使用(二):ELF文件与链接过程
linux·运维·服务器
ReaF_star2 小时前
【环保】CentOS 7 安装 MySQL 8 实战记录:从安装到排障一次讲清
linux·mysql·centos
雾岛听蓝2 小时前
Qt操作指南:状态栏、浮动窗口与对话框使用
开发语言·经验分享·笔记·qt
怀旧,2 小时前
【Linux系统编程】18. Linux进程信号(上)
linux·运维·服务器
minji...2 小时前
Linux 线程同步与互斥(五) 日志,线程池
linux·运维·服务器·开发语言·c++·算法
华清远见IT开放实验室3 小时前
嵌入式系统化课程 学习内容与服务说明
linux·stm32·学习·嵌入式·全栈·虚拟仿真·测评中心
圆山猫3 小时前
[Linux] Ubuntu 26.04 换阿里云镜像源(最新方法)
linux·ubuntu·阿里云
网络小白不怕黑3 小时前
1.2 VMware部署Rocky Linux 9 (MBR分区表,图形化安装)
linux·运维·服务器
贾斯汀玛尔斯3 小时前
每天学一个算法--Aho–Corasick 自动机
java·linux·算法