[qt] qt程序打包以及docker镜像打包

news2025/1/16 0:50:44

目录

一 环境准备:

1.1 qt环境

1.2 linuxdeplouqt打包工具

二 qt包发布:

2.1 搜索链接库

2.2 应用程序APP打包

2.3 发布

三 docker镜像包发布

3.1 环境准备

3.2 镜像生产脚本

3.3 加载镜像并运行docker容器


一 环境准备:

qt环境+linuxdeployqt打包工具+docker环境

1.1 qt环境

  • qt环境我们可以采用离线或者在线安装,主要是需要配置环境变量这个很重要,
  • 进入 /etc/profile 或者~/.bashrc下编辑QT对应的环境变量

#qt安装路径的目录

export QTDIR=/usr/local/qtui_env/debug

#qt安装路径的可执行文件目录 比如qmake等

export PATH=$QTDIR/bin:$PATH

#qt库文件路径这个很重要,Linuxdeployqt需要设置这个才能找到程序所需要的动态库
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

#qt插件目录位置
export QT_PLUGIN_PATH=$QTDIR/plugins:$QT_PLUGIN_PATH
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/local/qtui_env/plugins/platforms

  • 在配置好环境变量后,我们编译qt程序就可以直接使用qmake->make生成可执行文件了

1.2 linuxdeplouqt打包工具

这个工具的主要作用是为了找到qt运行所需要的库文件,我们只需要在GitHub下载可执行文件即可

点击此处。

  • 我们直接下载可执行文件就可以,基本上是不需要下载源码来编译的。
  • 接下来我们把下载到的文件移动到linux下,并将它改名(为了方便使用),后移动到系统的bin目录下
mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt
mv linuxdeployqt /usr/bin

二 qt包发布:

2.1 搜索链接库

  • 接下来只需要对qt生成的可执行文件执行下面的命令,就能够自动搜索到可执行文件所链接到的动态库

linuxdeployqt DRunLight --appimage

  • 这个ERROR是不会影响的,只要我们发现找到了对应的动态库,那就说明以及搜索成功了.

  • 这里要值得注意的是一个文件,我们会发现生成了一个qt.conf文件这个文件指定了qt的可执行文件会在哪里去查找所需要的库文件.有时候即使把搜索到的库文件放在系统bin目录下也是找不到的,必须按照这个位置来查找。

  • 接下来我们只需要将这个可执行文件和对应的lib放在一起,就可以在一个没有qt的环境下运行了。这样做的方法有个好处就是每次替换程序只需要替换可执行文件即可,很方便。

2.2 应用程序APP打包

  • 还有一种方法就是,我们之间把所有的库文件和可执行文件打包在一起生成一个APP应用,但这也会导致每次替换程序会很大。一般是不会采用这种方式的。我们在第一次使用 linuxdeployqt exe -appimage命令后,发现有ERROR,这时候只需要编辑desktop.desktop文件在最下面加上一句Categories=Application就可以打包成APP了

Categories=Application

2.3 发布

  • 一种方式是直接将搜索到的链接库和可执行文件打包压缩发布提供给第三方使用,这样需要注意的是,库的目录结构必须根据qt.conf配置文件下的结构,不能随意改动。
  • 另一种方式是直接将打包的APP发布出去,这样存在的问题就是每次替换程序会很大。因为实际上每次替换可执行文件(也就是更换软件版本时)我们并不需要替换一些动态的链接库。
  • 当然还有一种方式就是,我们只需要利用linuxdeployqt或者ldd的方式搜索到程序所需要的链接库,将这个库和未经过linuxdeployqt命令处理的可执行文件提供给使用者,使用者将链接库放入系统库目录下,这样可执行文件也是可以运行的,但这样隔离性就会很差。这种方式我们只是使用linuxdeployqt命令来搜索程序所用到的链接库,但是我们由于使用这个命令搜索后,他就会根据qt.conf文件给可执行文件加入链接库的搜索路径可能会导致,将链接库最终是放到目标系统的系统库目录下还是找不到链接库,这时候我们就需要用到未经过linuxdeployqt处理的命令的可执行文件了。

三 docker镜像包发布

3.1 环境准备

如果系统是只能离线安装,那么需要先配置镜像仓库,并且为yum源指定本地镜像仓库的位置。其实很简单只需要在/etc/yum.repos.d目录下配置一个一.repo为后缀的文件,然后将我们需要的离线rpm软件包放到一个指定目录下即可。

      [gantry_rpm]
# 镜像源的名称 无特殊作用
      name= gantry_rpm local repository
#这里指定了软件包的获取位置。
      baseurl=file:///etc_data/gantry_rpm
      gpgcheck=0
#1 表示启用 0 表示禁用
      enabled=1  
  • 安装docker依赖
yum install -y yum-utils device-mapper-persistent-data lvm2 
  • 安装docker服务
  • 如果安装失败说明没有可用的rpm包需要我们重新配置yum镜像源或者自定义离线镜像源
yum install -y docker-ce
  • 开机自启docker服务
systemctl start docker
systemctl enable docker
  • 创建虚拟网卡
  • 这时候docker的环境就准备好了
docker network create --driver bridge --subnet=172.30.0.0/24 vretcbridge

3.2 镜像生产脚本

  • 在制作镜像时我们一般需要准备这么几个文件
  • crontab.sh:放入镜像的系统自启动目录下,用来监控应用程序的状态
  • Dockerfile: 复制制作docker镜像
  • lib:可执行文件用到的库文件
  • make.sh: 制作镜像文件的启动
  • plygins:qt应用程序用到的插件库
  • start.sh: 用来重启应用程序的脚本
  • 首先我们需要写一个make.sh脚本用来开始自动化生成镜像文件
      1 #!/bin/bash
      2
      3 if [ -z "$1" ]; then
      4   echo "请输入版本号"
      5   exit
      6 else
      7   echo "制作镜像 testImage-x86:$1"
      8 fi
      9
     10 #镜像制作目录设置
     11 CRTDIR=$(cd "$(dirname "$0")"; pwd)
     12 PROCDIR=/testRun
     13
     14 #拷贝应用 将可执行文件复制到当前打包镜像的目录下
     15 cp -rf $PROCDIR/DRunLight   $CRTDIR/
     16
     17 #制作镜像
     18 docker build -t testImage-x86:$1 .
     19 # 将镜像保存为tar格式并进行压缩
     20 docker save testImage-x86:$1 | gzip > /images/testImage-x86-$1.tar.gz
  • 接下来需要编写一个Dockerfile文件,这个文件是真正用来生产镜像的
      1 #基础镜像源:官方centos
      2 FROM centos
      3
      4 #拷贝脚本
      5 COPY crontab.sh      /etc/rc.d/init.d/crontab.sh
      6 COPY restartall.sh   /testRun/restartall.sh
      7 #拷贝应用 将本地的可执行文件 库文件 启动脚本等拷贝到docker镜像中的指定位置
      8 COPY testExec       /testRun/
      9
     10 COPY lib/*          /testRun/lib/
     11
     12 COPY plugins/*      /testRun/plugins/
     13
     14 COPY start.sh      /testRun/
     15
     16 #docker启动的运行工作目录和启动时运行的脚本命令
     17 WORKDIR /etc/rc.d/init.d
     18 CMD ["./crontab.sh"]
  • 自启动脚本: 用来监测应用程序是否
#!/bin/bash
#chkconfig: 234 10 90
#description:start.sh

#添加权限
chmod 777 /testRun/*


#重启进程
function Process_Start()
{
    ps -fe|grep -w "/testRun" |grep -v grep
    if [ $? -ne 0 ]; then
       echo "start testExec"
       cd /testRun
       ./start.sh
    else
       echo "testExec is running"
    fi
}


#优先启动
Process_Start

#检查进程
while true
do
  sleep 3
  Process_Start
done

3.3 加载镜像并运行docker容器

  • 使用docker load -i 命令加载我们生产的镜像
docker load -i testImage-20240607.001.tar.gz
  • 使用docker run命令生成容器
docker run -d -v /test:/test --net=host --pid=host --restart=always 
--privileged --name=testimage testimage:20240607.001

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1810551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

顶顶通呼叫中心中间件-同振和顺振配置步骤(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-同振和顺振配置步骤(mod_cti基于FreeSWITCH) 一、拨号方案配置 1、同振 win-ccadmin配置方法 1、点击拨号方案->2、在红框中输入同振->3、点击添加->4、根据图中配置,配置好了等待一分钟即可生效。 web-ccadmin配置方法 2、顺振…

【已解决】chrome视频无法自动播放的问题

问题: 在用datav开发大屏的时候,放了一个视频组件,但是发现视频组件即使设置了自动播放,仍然无法自动播放 原因: 76 以上版本的谷歌浏览器只能在系统静音下自动播放 解决: 音频自动播放浏览器白名单设置&…

智慧交通的神经中枢:利用ARMxy进行实时交通流数据采集

气候变化和水资源日益紧张,精准农业成为了提高农业生产效率、节约资源的关键。在这一变革中,ARMxy工业计算机扮演了核心角色,特别是在智能灌溉系统的实施中。 背景介绍: 某大型农场面临着灌溉效率低、水资源浪费严重的问题。传统的…

K8S - 用kubectl远程访问内网的k8s集群

在之前的文章 K8S - 在任意node里执行kubectl 命令 介绍过, 通过任何node 的主机, 用kubectl 管理集群是很简单 无非就是两个步骤: 下载 k8s master 上的admin.conf在当前主机配置 K8SCONFIG 环境变量指向 下载的config file 其他内网主机也适用 其…

1奇函数偶函数

文章目录 自变量有理化奇偶性周期性初等函数 自变量 自变量是x,这个还挺奇怪,记住就好 y f ( e x 1 ) yf(e^x1) yf(ex1) 里面 e x e^x ex 只算中间变量,自变量是x 做这些题,想到了以前高中的时候做数学题,不够扎实…

三菱电子推出16W GaN PA,用于大规模MIMO

三菱电机匠心独运,为5G大规模MIMO(mMIMO)基站带来了革新性的解决方案——全新的16W平均功率GaN功率放大器模块(PAM)样品。这款PAM如一位技艺高超的舞者,轻盈地跃入32T32R mMIMO天线的舞台,以优雅…

免费插件集-illustrator插件-Ai插件-文本属性批处理

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件,加强illustrator使用人员工作效率,进行文本属性批处理。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&am…

夺冠了!U19国足是什么?这场夺冠对于中国足球意味着什么?

夺冠了!U19国足是什么?这场夺冠对于中国足球意味着什么? 在2024年“丝绸之路华山杯”渭南国际足球邀请赛中,中国U19国家男子足球队以出色的表现,力压群雄,最终夺得冠军。这一成绩不仅是对U19国足队员们辛勤…

C++ (week6、7):Linux系统编程4:网络

文章目录 四、网络和网络编程(一) 网络协议1.基础概念2.网络协议和网络模型:OSI七层模型、TCP/IP四层协议3.TCP协议(1)TCP协议的特点(2)TCP协议的首部格式(3)TCP状态图(4)为什么要三次握手?2次行不行?(5)为什么要四次挥手?(6)快速…

今日科普:生命杀手——“脑出血”

在我们的日常生活中,有一种被称为“脑出血”的疾病,它像是一位潜伏的杀手,无声无息地威胁着我们的生命。脑出血,简单来说,就是脑部血管破裂,导致血液流入脑组织,形成血肿,压迫和破坏…

AI 大模型的风,吹到了浏览器

Chrome 浏览器是谷歌最重要的产品之一。在互联网时代,掌握着流量的入口,帮助谷歌建立起了互联网霸主的地位。Chrome 浏览器不仅在市场占有率方面遥遥领先,还成为了许多用户接入互联网的首选工具。凭借其速度、安全性和丰富的扩展功能&#xf…

计算机网络7——网络安全4 防火墙和入侵检测

文章目录 一、系统安全:防火墙与入侵检测1、防火墙1)分组过滤路由器2)应用网关也称为代理服务器(proxy server), 二、一些未来的发展方向 一、系统安全:防火墙与入侵检测 恶意用户或软件通过网络对计算机系统的入侵或攻击已成为当今计算机安…

生成式人工智能重置:从初期热潮到战略扩展

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

DSP28335模块配置模板系列——定时器中断配置模板

一、配置步骤: 1.使能定时器时钟 EALLOW;SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK 1; // CPU Timer 2EDIS; 2.设置定时器的中断向量 EALLOW;PieVectTable.TINT2 &TIM2_IRQn;EDIS;其中TIM2_IRQn时定时器中断服务程序的名称 ,将中断服务函数的地址…

【面试干货】聚集索引和非聚集索引区别?

【面试干货】聚集索引和非聚集索引区别? 1、聚集索引(Clustered Index)1.1 特点1.2 例子 2、非聚集索引(Nonclustered Index)2.1 特点2.2 例子 3、根本区别 💖The Begin💖点点关注,收藏不迷路&…

[Vue3:组件通信)子组件props接收和watch监听,emit发送父组件 (添加修改设置成绩,添加、删除选课记录)

文章目录 一:系统功能:设置成绩(添加或修改)交互逻辑:涉及页面 Page02.vue,ModalEdit.vue主页面Page.vue注入子页面,使用子页面标签属性主页面对子页面做通信,子页面ModalEdit接收参…

在win11系统上安装启动Hyper-V

Hyper-V 是微软公司开发的一种虚拟化技术,它允许一台物理计算机运行多个操作系统和应用程序,从而提供更好的资源利用率和系统灵活性。 win系统的linux子系统开启、android studio的虚拟环境都需要这个东西,而在初始的win11系统上可能没有这个…

CTFHUB-SQL注入-时间盲注

本题用到sqlmap工具,没有sqlmap工具点击🚀🚀🚀直达下载安装使用教程 理论简述 时间盲注概述 时间盲注是一种SQL注入技术的变种,它依赖于页面响应时间的不同来确定SQL注入攻击的成功与否。在某些情况下,攻…

Ansible离线部署 之 Zabbix

Ansible介绍 Ansible 是一个自动化平台,用于 IT 自动化,如配置管理、应用部署、任务自动化等。Ansible 使用 SSH 来连接到远程机器,并执行预定义的任务。Ansible 的主要特点是其简单性、易用性和强大的功能集。 以下是 Ansible 的一些关键特…

DeepSpeed MoE

MoE概念 模型参数增加很多;计算量没有增加(gating小FNN,比以前的大FNN计算量要小);收敛速度变快; 效果:PR-MoE > 普通MoE > DenseTransformer MoE模型,可视为Sparse Model&…