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

目录

一 环境准备:

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.mfbz.cn/a/695950.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python学习打卡:day01

day1 笔记来源于:黑马程序员python教程,8天python从入门到精通,学python看这套就够了 1、Python 软件(PyCharm) 安装:在 Linux 环境下安装 Pycharm 插件:汉化、翻译 设置字体大小 常用快捷…

【MySQL】(基础篇五) —— 排序检索数据

排序检索数据 本章将讲授如何使用SELECT语句的ORDER BY子句,根据需要排序检索出的数据。 排序数据 还是使用上一节中的例子,查询employees表中的last_name字段 SELECT last_name FROM employees;输出结果: 发现其输出并没有特定的顺序。其实&#xf…

【Linux】进程3——PID/PPID,父进程,子进程

在讲父子进程之前,我们接着上面那篇继续讲 1.查看进程 mycode.c makefile 我们在zs_108直接编译mycode.c,直接运行,然后我们转换另一个账号来查看这个进程 我们可以通过ps指令来查看进程 我们就会好奇了,第二行是什么&#xff…

牛客热题:矩阵的最小路径和

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:矩阵的最小路径和题目链接方法一…

[数据集][目标检测]变电站火灾检测电力场景烟雾明火检测数据集VOC+YOLO格式140张2类别真实场景非PS合成

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):140 标注数量(xml文件个数):140 标注数量(txt文件个数):140 标注类别…

模型 SCAMPER创新法则

说明:系列文章 分享 模型,了解更多👉 模型_思维模型目录。激发创新的七步思维法。 1 SCAMPER创新法则的应用 1.1 SCAMPER应用之改进自行车设计 一家自行车制造商希望改进其自行车设计,以吸引更多的消费者并提高市场份额。他们决…

Python chardet库:字符编码检测

更多Python学习内容:ipengtao.com 在处理文本文件时,字符编码问题常常会导致乱码和错误。Python的chardet库是一个功能强大的字符编码检测工具,能够帮助开发者自动检测文本的编码方式,从而正确地读取和处理文本文件。本文将详细介…

⌈ 传知代码 ⌋ 【CLIP】文本也能和图像配对

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

LLM Algorithms(1): Flash Attention

目录 Background Flash Attention Flash Attention Algorithm 参考 NIPS-2022: Flash Attention: Fast and Memory-Efficient Exact Attention with IO-Awareness idea:减少资源消耗,提升或保持模型性能。普通attention的空间复杂度是 --》降低到F…

【PR2019】怎样批量添加转场效果及修改默认持续时间

一,设置“交叉溶解”效果到所有素材 选择效果,右击“将所选过渡设置为默认过渡”: 框选所有素材,“Ctrl D”: 每个素材中间有有了交叉溶解的效果: 二,修改效果属性 2.1,单个修…

1.nginx介绍

介绍 是一个高性能的http和反向代理服务器。 特点 占用内存少,并发能力强。 nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50,000个并发连接数。 基…

拐点已至:企业如何借助AI重塑增长?

2024年的激进增长与AI数智化创新并行,传统策略的功效已经减弱。在这篇文章中,我们将展望并深度探索2024年的6大创新增长策略,包括AI驱动的实验,产品再造,超个性化,自动化运营,短视频和KOL营销等…

力扣hot100: 48. 旋转图像

LeetCode:48. 旋转图像 受到力扣hot100:54. 螺旋矩阵的启发,我们可以对旋转图像按层旋转,我们只需要记录四个顶点,并且本题是一个方阵,四个顶点就能完成图像的旋转操作。 1、逐层旋转 注意到&#xff0…

Java核心: JarIndex的使用

在讲解Java类加载器的时候,我们发现URLClassLoader加载类或资源时通过访问ClassPath下的每一个路径,来确定类是否存在的,假设我们执行的命令是这样的 java -classpath D:\DiveInSpring\target\classes;C:\lib\spring-expression.jar;C:\lib\…

扩展学习|风险管理的文献综述汇总(持续更新向)

一、风险管理发展历程和趋势综述(2007年发表) 文献来源:[1]严复海,党星,颜文虎.风险管理发展历程和趋势综述[J].管理现代化, 2007(2):4.DOI:CNKI:SUN:GLXX.0.2007-02-009. 简介:该文以风险管理发展历程中的大事件为线索, 对风险管…

第1回 最开始的两行代码

当你按下开机键的那一刻,在主板上提前写死的固件程序BIOS会将硬盘启动区中的512(B)的数据,原封不动地复制到内存中的0x7c00这个位置,并跳转到那个位置: 下面我们针对每一步做详细介绍. 开机后初始化指向BIOS CPU中有一个PC寄存器,里面存储这将要执行的指令在内存中的地…

挑战绝对不可能:再证有长度不同的射线

黄小宁 一空间坐标系中有公共汽车A,A中各座位到司机处的距离h是随着座位的不同而不同的变数,例如5号座位到司机处的距离是h3,…h5,…。A移动了一段距离变为汽车B≌A,B中5号座位到司机处的距离h’h3,…h’h5…

C语言详解文件操作

目录 什么是文件? 为什么使用文件? 程序文件和数据文件、文本文件和二进制文件 1.程序文件和数据文件 1.1程序文件 1.2数据文件 2.文本文件和二进制文件 文件的打开和关闭(流、标准流、文件指针和文件的打开与关闭) 1.流和标…

了解常用智能指针

智能指针 1、概念 C中引入智能指针的主要目的是为了解决内存管理的问题,传统的指针(裸指针)在使用时需要手动分配和释放内存,容易出现内存泄漏和悬挂指针等问题。智能指针通过封装裸指针,并提供自动内存管理功能&…

Python私教张大鹏 Vue3整合Vue Router之编程式导航

除了使用 <router-link> 创建 a 标签来定义导航链接&#xff0c;我们还可以借助 router 的实例方法&#xff0c;通过编写代码来实现。 导航到不同的位置 注意: 下面的示例中的 router 指代路由器实例。在组件内部&#xff0c;你可以使用 $router 属性访问路由&#xff…