Qt Linux 环境中应用程序打包

这篇具有很好参考价值的文章主要介绍了Qt Linux 环境中应用程序打包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系统环境:Ubuntu20.04LTS
开发环境:Qt5.14.1

打包须知:

在进入程序部署打包之前,阅读官方的部署文档Deploy,通常情况下,我们在开发的时候,Qt Creator 的左下角构建模式为Debug,便于我们调试编写程序。Qt的三个构建模式Debug、Profile、Release的区别是: debug可以调试程序,而release不可以。在程序出现错误的时候,在debug模式下通过设置断点来调试程序。当程序所有错误都解决了以后,在release模式下生成程序,就可以对外发布了。debug生成的程序因为包含了调试信息,编译器也未做优化,所以比release模式生成的程序要大很多,而Profile则介于两者之间,用的较少。Qt Linux 环境中应用程序打包
Qt Linux 环境中应用程序打包
一定要确保程序在Debug模式下,能正确运行,方可进行打包(Release),通常我们选择共享动态库的形式打包,一般需要三步:

生成 release 版本的可执行文件 .exe;
找到所有的动态链接库 dll;
将所有的 dll 以及依赖的各种文件和可执行文件打包在一起生成最终的一个可执行文件
这样即可在为未安装Qt的机器上使用。

一、将Qt的构建模式设置为Release,构建程序,将生成对应的程序Release文件夹。

例如本文的示例程序qmlideo生成的Release文件夹:
Qt Linux 环境中应用程序打包
其中,生成的qmlvideo(你的应用程序名称)文件是共享库文件(x-sharedlib),并非可执行文件,
Qt Linux 环境中应用程序打包
如果遇到这样的问题,请在pro文件里加上一行:QMAKE_LFLAGS += -no-pie
重新构建Release,可以看到qmlvideo文件已经成为可执行文件
Qt Linux 环境中应用程序打包
接下来,进入Release文件夹,打开终端, 输入ldd qmlvideo
Qt Linux 环境中应用程序打包
这里是可执行程序qmlvideo依赖的动态库,需要将这些动态库和可执行程序放到一起。
新建一个空文件夹,用来放打包后的程序文件。我建立一新文件NewPro,将可执行文件qmlvideo复制到NewPro,这里写一个脚本,将上述的所有依赖库都找出来。在Release文件夹中新建copylib.sh

#!/bin/bash

LibDir=$PWD"/lib"
Target=$1

lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))

$(mkdir $LibDir)

for Variable in ${lib_array[@]}
do
    cp "$Variable" $LibDir
done
#$

设置权限chmod 777 copylib.sh,运行./copy.sh qmlvideo, 在Release中生成了lib文件夹
Qt Linux 环境中应用程序打包
将lib中所有文件复制到新文件夹NewPro中,此时,NewPro文件夹的内容为可执行文件qmlvideo 和lib中的所有动态库。
下一步,补充动态库,因为后续可能会发生“xcb"错误;进入Qt安装目录文件夹,依次进入“版本号”->“gcc_64”->"plugins"中(我这里是Qt5.14.1/5.14.1/gcc_64/plugins/),复制platforms文件夹到NewPro文件夹下:
Qt Linux 环境中应用程序打包将copylib.sh复制到NewPro/platforms文件夹中,运行:./copylib libqxcb.so命令,同样生成lib文件夹(这里是libqxcb的依赖库,若缺少,将触发“xcb”错误),将lib文件夹下所有文件拷到NewPro目录下,遇到文件冲突选择全部替换。
在NewPro目录下,创建脚本文件xxx.sh(xxx为可执行程序名,我这里是qmlvideo.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 "$@"

将NewPro文件夹拷贝到一台同系统没有Qt环境的电脑上,进入NewPro目录后,运行:./qmlvideo.sh命令即可启动程序。

可能出现的问题:

一、"xcb"错误:
在应用程序目录中,打开终端,

export QT_DEBUG_PLUGINS=1

运行应用程序的脚本./qmlvideo.sh ,可以查看依赖库加载过程,如下图:
Qt Linux 环境中应用程序打包
如有not found的依赖库,再去Qt安装路径下的platforms中找到复制过来。

二、Segmentation Fault
本人只是在移植到Ubuntu16时,出现段错误,请确保你的打包系统和移植系统一致。有库的版本问题,依赖问题,你可以选择连依赖基础库,如gcc都带进去.

三、程序图片无法加载,图标无法显示

若程序有图片需要加载,涉及到图形依赖库,在Qt安装目录中和platforms同目录下有个imageformats目录:
Qt Linux 环境中应用程序打包将整个imageformats目录复制到NewPro目录中即可,同时,如果有预加载图片,也要一并放入NewPro中,若以qrc的形式加载,也要将qrc文件目录放到NewPro中。文章来源地址https://www.toymoban.com/news/detail-427440.html

到了这里,关于Qt Linux 环境中应用程序打包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用linuxdeploy-x86_64.AppImage打包QT应用程序的步骤

    使用AppImage打包名为irSync的QT应用程序的重新生成步骤 应用程序名为myApp  icon名为:logo.png 1.创建一个名为PacketAppDir的文件夹。 2.准备myApp.desktop文件,文件内容为: [Desktop Entry] Version=1.0 Type=Application Name=myApp Exec=myApp Icon=logo Categories=Utility; 3.准备脚本文件AppRun,内容如下 #!/bin/

    2024年02月08日
    浏览(30)
  • VS2019 打包桌面应用程序详细步骤,包含运行环境(.NET Framework)

    本篇教程基于VS扩展插件Microsoft Visual Studio Installer Projects工具来打包, 在VS工具中进行安装,菜单栏【扩展(X)】 -- 【管理扩展】,在界面中输入Installer,找到Microsoft Visual Studio Installer Projects,点击下载 在解决方案上右键 –【添加】--【新建项目】– 【Setup Project】,

    2024年02月04日
    浏览(54)
  • 启动QT Linux应用程序后黑屏闪烁?

    提问 问 4 年, 3 个月 前 修改于 3 个月前 点击833次 1 我将嵌入式Linux(imx6q)与eglfs一起使用。 帧缓冲在启动Qt应用程序时正在绘制黑屏。 简单的应用程序是黑色的1秒下。重度施用4~5秒。 这仅在首次 QT 运行时发生一次。 如何防止qt画成黑色?我可以修改内核或 QT 源。 我正

    2024年02月09日
    浏览(38)
  • QT 应用程序在 Windows 系统上出现中文乱码

    Windows 早期采用多字节编码,的确容易出现乱码问题。随着 Windows 全面转向 Unicode 编码,多语言的支持得到完美解决,出现中文乱码的问题就很少出现。出现乱码问题一般是 GBK 编码的文件当做 utf8 编码打开,或者 utf8编码的文件当做 GBK 编码打开。这种情况也多出现在 Linux 和

    2024年01月16日
    浏览(32)
  • Qt实现遮罩窗口系统全屏锁定或应用程序界面锁定

    qmaskdialog.h qmaskdialog.cpp showFullScreen:全屏遮罩 showMaximized:除任务栏外,全屏 qhook.h qhook.cpp 若仅为应用程序主界面,则设置父窗口,并调用以下函数,盖住主界面 若要遮罩窗口跟随主界面自动拉伸,需重写主界面(MainWindow)的ResizeEvent,如果为全屏遮罩,则不需要, 目前的效果是

    2024年01月23日
    浏览(41)
  • linux系统应用程序启动脚本

    其他的stop.sh、restart.sh写法同start.sh

    2024年02月05日
    浏览(46)
  • RK3568平台开发系列讲解(Linux系统篇)Linux 应用程序的安全

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇让我们如何写出尽可能安全的应用程序。

    2023年04月16日
    浏览(34)
  • 基于Qt、PYTHON智能校园防御系统应用程序,实现了摄像头数据采集、人脸识别、口罩识别、 数据统计等功能

    完整项目地址:https://download.csdn.net/download/lijunhcn/88453470 项目结构 环境选型 语言:Python 操作系统:Windows 数据库:MySQL 窗口界面:PyQT API接口:百度AI接口,用以实现人脸登陆与注册 远程MySQL表结构 远程表结构sql脚本 项目背景 智能校园防御软件是实现了一款基于摄像头数据

    2024年02月03日
    浏览(42)
  • 1、MATLAB程序设计与应用刘卫国(第三版)课后实验一:MATLAB系统环境与运算基础

    目录 一、 二、 三、 四、 五、 六、 启动MATLAB系统环境,完成下列操作。 (1)在 MATLAB命令行窗口输入以下命令后,观察工作区窗口的内容。 x=0:pi/10:2*pi; y=sin(x); (2)在工作区窗口右击变量x、y,再在快捷菜单中选择“删除”命令将它们删除。 ---------------------------------------------

    2024年02月02日
    浏览(31)
  • 毕设项目——基于Qt、PYTHON智能校园防御系统应用程序,实现了摄像头数据采集、人脸识别、口罩识别、 数据统计等功能

    完整项目地址:https://download.csdn.net/download/lijunhcn/88453470 项目结构 环境选型 语言:Python 操作系统:Windows 数据库:MySQL 窗口界面:PyQT API接口:百度AI接口,用以实现人脸登陆与注册 远程MySQL表结构 远程表结构sql脚本 项目背景 智能校园防御软件是实现了一款基于摄像头数据

    2024年02月04日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包