当前位置: 首页 > news >正文

[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_rpmgpgcheck=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/bash23 if [ -z "$1" ]; then4   echo "请输入版本号"5   exit6 else7   echo "制作镜像 testImage-x86:$1"8 fi910 #镜像制作目录设置11 CRTDIR=$(cd "$(dirname "$0")"; pwd)12 PROCDIR=/testRun1314 #拷贝应用 将可执行文件复制到当前打包镜像的目录下15 cp -rf $PROCDIR/DRunLight   $CRTDIR/1617 #制作镜像18 docker build -t testImage-x86:$1 .19 # 将镜像保存为tar格式并进行压缩20 docker save testImage-x86:$1 | gzip > /images/testImage-x86-$1.tar.gz
  • 接下来需要编写一个Dockerfile文件,这个文件是真正用来生产镜像的
      1 #基础镜像源:官方centos2 FROM centos34 #拷贝脚本5 COPY crontab.sh      /etc/rc.d/init.d/crontab.sh6 COPY restartall.sh   /testRun/restartall.sh7 #拷贝应用 将本地的可执行文件 库文件 启动脚本等拷贝到docker镜像中的指定位置8 COPY testExec       /testRun/910 COPY lib/*          /testRun/lib/1112 COPY plugins/*      /testRun/plugins/1314 COPY start.sh      /testRun/1516 #docker启动的运行工作目录和启动时运行的脚本命令17 WORKDIR /etc/rc.d/init.d18 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 grepif [ $? -ne 0 ]; thenecho "start testExec"cd /testRun./start.shelseecho "testExec is running"fi
}#优先启动
Process_Start#检查进程
while true
dosleep 3Process_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

相关文章:

  • hw meta10 adb back up DCIM
  • 2_1 Linux基础操作
  • MySQL数据库的基础:逻辑集合数据库与表的基础操作
  • SpringCloud 网关配置websocket
  • 【Bazel入门与精通】 rules之属性
  • wooyun_2015_110216-Elasticsearch-vulfocus
  • 算法:读取redis中指令查询的键
  • Ffmpeg安装和简单使用
  • CentOS 7基础操作08_Linux查找目录和文件
  • 电阻常见失效模式
  • C#操作MySQL从入门到精通(15)——分组数据
  • 实验3-单链表(优化版/王道版)
  • 前端面试题日常练-day63 【面试题】
  • 881. 救生艇
  • maven多模块项目搭建
  • 2017 年终总结 —— 在路上
  • go append函数以及写入
  • Java 多线程编程之:notify 和 wait 用法
  • Java 网络编程(2):UDP 的使用
  • Joomla 2.x, 3.x useful code cheatsheet
  • Laravel5.4 Queues队列学习
  • passportjs 源码分析
  • python 装饰器(一)
  • socket.io+express实现聊天室的思考(三)
  • ViewService——一种保证客户端与服务端同步的方法
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 算法-插入排序
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 移动端唤起键盘时取消position:fixed定位
  • 异常机制详解
  • 原生 js 实现移动端 Touch 滑动反弹
  • Java性能优化之JVM GC(垃圾回收机制)
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • (2022 CVPR) Unbiased Teacher v2
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (HAL库版)freeRTOS移植STMF103
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (八)c52学习之旅-中断实验
  • (办公)springboot配置aop处理请求.
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (南京观海微电子)——COF介绍
  • (强烈推荐)移动端音视频从零到上手(下)
  • (推荐)叮当——中文语音对话机器人
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***详解账号泄露:全球约1亿用户已泄露
  • .axf 转化 .bin文件 的方法
  • .gitignore文件设置了忽略但不生效
  • .net 7 上传文件踩坑
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net Stream篇(六)
  • .Net 基于IIS部署blazor webassembly或WebApi
  • .NetCore 如何动态路由
  • .Net中wcf服务生成及调用