Linux打包发布qt应用程序

本文详细介绍如何在Ubuntu 18.04环境下使用Qt 5.12.4打包Qt应用程序,包括编译文件、获取依赖库文件及编写执行脚本的方法。


Qt应用程序在windows下打包相对比较简单;Linux下使用Qt进行开发的程序,如果想要在其他搭载Linux系统的主机上运行则需要将要发布的Qt程序依赖的一些动态链接库一起打包,主要方法:Linux系统下可以手写一个脚本文件,充分利用ldd命令进行打包。

一.环境介绍

操作系统环境: ubuntu18.04 64位

QT版本: 5.12.4

二.编译文件

  1. 在Qt中使用release的方式编译出可执行文件;
  2. 新建一个文件夹,将可执行文件拷贝进去备用。

三.使用脚本文件获取依赖库文件

1. 编写脚本文件

使用命令进入可执行文件的目录下,然后在这个空目录下新建一个文件(pack.sh),文件内容如下:

#!/bin/sh  
exe="myApp"#需发布的程序名称
des="xxxxx"#步骤一中新建目录的完整路径
deplist=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')  
cp $deplist $des

2. 赋予脚本文件权限并执行

chmod 777 pack.sh
./pack.sh

可执行文件依赖的链接库将会拷贝到所在的目录

3. 拷贝所依赖的qt平台的库文件

为了发布过程不出现各种BUG,找不到库、找不到平台等等一系列问题,现在使用一个笨办法。
将QT使用的编译器目录下的所有库拷贝到上述所建文件夹下。
查找本机QT安装路径,我的安装路径为: /opt/Qt5.14.2/5.14.2/gcc_64/
将QT使用的编译器目录下的plugins文件夹拷贝到上述文件夹目录下(主要依赖platform文件夹所包含的库文件,可以实验只用platform库文件程序是否可以正常运行)。这样得到的文件可能会比较多,然后在保证程序正常运行的情况下,可以尝试删除无用的库文件。

注:直接ldd命令和可能遇到缺少库问题

直接使用linux的ldd命令也可以查找可执行文件的依赖库,ldd命令和脚本功能一样,写成脚本是为了方便,查找之后就拷贝过来。使用ldd命令查找到依赖库需要自己一个个去当前系统中查找,命令示例:

ldd myapp

可能会遇到提示无法加载xcb插件等类似问题,一般这种问题就是缺少了动态库的依赖环境

libQt5XcbQpa.so.5
libQt5Dbus.so.5

这是两个链接,需要使用命令来查看Qt不同版本对应的这两个文件的实体文件(直接拷贝链接文件无效),进入Qt安装环境中下的lib库,一般是/Qt5.xx.x/xx.x/gcc_xx/lib这路径,进入后找到并复制到打包文件夹中。
即将原来的链接文件删除,并把文件复制进来并修改为原来的链接文件名。

四.编写执行脚本

1. 编写执行脚本

使用命令进入可执行文件的目录下,然后新在这个空目录下新建一个文件(myapp.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  
echo $LD_LIBRARY_PATH
export PATH=$LD_LIBRARY_PATH:$PATH
echo $PATH
$dirname/$appname "$@"

此脚本目的是为了设置环境变量,告诉执行程序库所在的路径,所以可以写一个shell脚本方便程序的部署,直接使用脚本启动程序即可。其中,带echo的两行脚本只是为了能在终端看到路径的名称,为了调试方便。
注:需要注意的是,最后让程序运行的是脚本,所以我们直接运行myapp.sh这个脚本让程序运行成功,此文件名必须和执行程序同名,且在同一目录下。

2. 赋予执行脚本文件权限并执行

chmod 777 myapp.sh
./myapp.sh
<think>好的,我现在需要帮用户解决在Linux打包发布Qt应用程序的问题。首先,我得回忆一下自己之前处理类似任务的经验,或者查找相关资料确保信息准确。用户可能是一个开发者,刚完成了一个Qt项目,现在想打包发布,让其他Linux用户能够方便地安装和运行,而不需要自己编译或者处理依赖问题。 首先,我应该考虑不同的打包方式,因为用户可能有不同的需求。常见的方法包括使用linuxdeployqt工具、手动整理依赖、以及创建安装包如.deb或.rpm。每种方法的步骤和注意事项都需要详细说明,避免用户遗漏关键点。 接下来,使用linuxdeployqt工具。这个工具比较自动化,适合快速打包。我需要解释安装步骤,比如从GitHub下载并编译,或者通过系统的包管理器安装。然后是如何使用它,指定qmake路径,可能需要处理插件和图标的问题。需要提醒用户注意路径是否正确,动态库是否被正确包含,特别是如果项目使用了特定的Qt模块,比如多媒体或WebEngine,可能需要手动添加插件。 然后是手动整理依赖的方法。这种方法虽然繁琐,但能让用户更了解依赖关系。需要列出步骤,如使用ldd查找依赖,复制库文件到指定目录,并编写启动脚本设置LD_LIBRARY_PATH。这里可能会遇到的问题比如库的路径不同,或者有隐藏的依赖,可能需要用户多次测试确保所有依赖都被包含。 接着是创建.deb或.rpm包。这适合想要分发给更多用户的情况,尤其是通过包管理器。需要安装dh_make或rpmbuild工具,配置控制文件,指定依赖关系。这里需要注意权限问题,比如使用fakeroot,以及正确填写包的信息,如版本、维护者等。同时,可能需要指导用户如何测试生成的包是否安装正确,是否存在遗漏的依赖。 还需要提到可能遇到的问题,比如动态库路径错误,插件缺失,尤其是图形相关的问题,比如XCB插件。这时候可能需要检查Qt的插件目录是否正确打包,或者设置环境变量QT_QPA_PLATFORM_PLUGIN_PATH。 另外,用户可能不知道如何处理应用程序图标和桌面文件,需要说明如何创建.desktop文件,并确保图标路径正确,这样应用程序才能在启动器中显示正确图标。 最后,应该总结各种方法的优缺点,帮助用户根据具体情况选择。比如linuxdeployqt适合快速打包,手动方法适合学习,而deb/rpm适合正式分发。同时,提醒测试的重要性,建议在干净的系统中测试打包结果,避免本地环境的影响。 需要确保步骤清晰,语言简洁,避免使用过于专业的术语,让新手也能理解。同时,检查是否有遗漏的步骤,比如处理翻译文件、文档等,但可能这些属于高级内容,用户可能暂时不需要。保持回答结构合理,分点说明,便于用户一步步操作。</think>以下是在Linux系统下打包发布Qt应用程序的详细步骤: ### 一、准备工作 1. 编译为Release版本 ```bash qmake -makefile make release ``` 2. 清理调试信息(可选) ```bash strip --strip-all <可执行文件名> ``` ### 二、打包方法推荐 #### 方法1:使用linuxdeployqt工具(自动化推荐) 1. 安装工具 ```bash # Ubuntu/Debian sudo apt install linuxdeployqt # 其他系统可从源码编译: git clone https://github.com/probonopd/linuxdeployqt.git cd linuxdeployqt qmake && make sudo make install ``` 2. 执行打包 ```bash linuxdeployqt <可执行文件> -appimage ``` 3. 关键参数说明: - `-qmake=<qmake路径>` 指定自定义qmake - `-extra-plugins=<插件列表>` 添加额外插件 - `-executable=<附加可执行文件>` 包含辅助程序 #### 方法2:手动整理依赖 1. 创建打包目录 ```bash mkdir MyApp cp <可执行文件> MyApp/ ``` 2. 收集依赖库 ```bash ldd <可执行文件> | grep "=> /" | awk '{print $3}' | xargs -I '{}' cp -v '{}' MyApp/lib ``` 3. 添加Qt插件 ```bash cp -r <Qt安装路径>/plugins/* MyApp/plugins/ ``` 4. 创建启动脚本`MyApp/run.sh`: ```bash #!/bin/bash export LD_LIBRARY_PATH=$(dirname "$0")/lib:$LD_LIBRARY_PATH export QT_PLUGIN_PATH=$(dirname "$0")/plugins ./<可执行文件名> ``` #### 方法3:生成安装包(deb/rpm) 1. 创建基本结构: ```bash mkdir -p pkg/usr/{bin,lib,share/applications,share/icons} ``` 2. 部署文件: - 可执行文件 -> pkg/usr/bin - 依赖库 -> pkg/usr/lib - 桌面文件 -> pkg/usr/share/applications - 图标 -> pkg/usr/share/icons/hicolor/<尺寸>/apps 3. 创建控制文件(以deb为例): ```bash # pkg/DEBIAN/control Package: myapp Version: 1.0 Section: utils Priority: optional Architecture: amd64 Depends: libqt5core5a (>= 5.9), ... Maintainer: Your Name <email@example.com> Description: My Qt Application ``` 4. 打包生成: ```bash dpkg-deb --build pkg ``` ### 三、注意事项 1. 常见问题处理: - 缺失XCB插件:复制`platforms/libqxcb.so` - 字体问题:包含`libfontconfig.so.1` - 图形支持:确保包含OpenGL相关库 2. 验证方法: ```bash # 在新环境中测试 mkdir test_env LD_LIBRARY_PATH=./lib QT_DEBUG_PLUGINS=1 ./run.sh ``` 3. 高级优化: - 使用`patchelf`修改rpath - 生成AppImage格式可移植包 - 使用Qt自带的`windeployqt`工具辅助分析依赖 建议优先使用linuxdeployqt工具进行自动化打包,遇到特殊需求再结合手动调整。打包完成后,应在干净的虚拟机或Docker容器中进行验证测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值