当前位置: 首页 > 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容器

四 补充

4.1 时间不同步问题解决


一 环境准备:

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

四 补充

4.1 时间不同步问题解决

在打包镜像时如果在DockerFile文件里面我们没有本地的etc下的localtime文件复制道docker里面,可能会存在系统时间不一致的问题,这大概率是因为时区的问题。我们有这几种方式解决

  • dockerfile:
COPY /etc/localtime /etc/
  • 宿主机中
docker cp -L /etc/localtime <容器ID或容器名>:/etc/
  • 挂在容器时
docker run -v /etc/localtime:/etc/localtime

相关文章:

[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容器 四 补充 4.1 时间不同步问题解决 一 环境准备: qt环境l…...

电脑屏幕监控软件有哪些?2025年监控软件排行榜

电脑屏幕监控软件有哪些&#xff1f;2025年监控软件排行榜 虽然现在还是2024年&#xff0c;但是有一些被广泛讨论和推荐的电脑屏幕监控软件&#xff0c;它们将在2025年异军突起&#xff0c;成为行业的引领者。 1.安企神软件&#xff1a; 功能全面的电脑屏幕监控软件&#xf…...

音视频主要概念

文章目录 常用的一些概念主要概念1主要概念2I帧P帧B帧 常用视频压缩算法 小结 常用的一些概念 主要概念1 视频码率&#xff1a;kb/s&#xff0c;是指视频文件在单位时间内使用的数据流量&#xff0c;也叫码流率。码率越大&#xff0c;说明单位时间内取样率越大&#xff0c;数…...

AIGC全面介绍

AIGC&#xff08;Artificial Intelligence and General Competitions&#xff09;是一个专注于人工智能和综合能力竞赛的组织。AIGC的目标是促进人工智能和综合能力的发展&#xff0c;并为相关领域的学术研究和应用创新提供支持和平台。 AIGC主要致力于人工智能竞赛的组织、举…...

vscode中模糊搜索和替换

文章目录 调出搜索&#xff08;快捷键&#xff09;使用正则&#xff08;快捷键&#xff09;替换&#xff08;快捷键&#xff09;案例假设给定文本如下目标1&#xff1a;查找所有函数名目标2&#xff1a;替换所有函数名为hello目标3&#xff1a;给url增加查询字符串参数 调出搜索…...

人工智能入门学习教程分享

目录 1.首先安装python,官网地址:Download Python | Python.org,进入网址,点击Windows链接 2.下载完成之后,进行傻瓜式安装,如果不选安装路径,默认会安装到C:\Users\Administrator\AppData\Local\Programs\Python\Python38目录下。 3.配置python环境变量,即把python的…...

Django序列化器详解:普通序列化器与模型序列化器的选择与运用

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…...

Commons-io工具包与Hutool工具包

Commons-io Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包 作用:提高I0流的开发效率。 FileUtils类(文件/文件夹相关) static void copyFile(File srcFile,File destFile) 复制文件 static void copyDirectory(File srcDir,File destDir) 复…...

ROS中Twist消息类型

Twist消息类型在Robot Operating System (ROS)中是一个常见的数据结构&#xff0c;主要用于描述物体的线性速度和角速度。这种消息类型在ROS的geometry_msgs包中定义&#xff0c;常用于机器人运动控制&#xff0c;尤其是当需要向机器人发布速度指令时。 Twist消息由两个Vector…...

Pixi.js学习 (四)鼠标跟随、元素组合与图片位控

目录 一、鼠标移动跟随 1.1 获取鼠标坐标 1.2 鼠标跟随 二、锚点、元素组合 2.1 锚点 2.2 元素组合 三、图片图层 四、实战 例题一&#xff1a;完成合金弹头人物交互 例题二&#xff1a;反恐重击瞄准和弹痕 例题一代码&#xff1a; 例题二代码&#xff1a; 总结 前言 为了提高作…...

Golang | Leetcode Golang题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; func wordBreak(s string, wordDict []string) bool {wordDictSet : make(map[string]bool)for _, w : range wordDict {wordDictSet[w] true}dp : make([]bool, len(s) 1)dp[0] truefor i : 1; i < len(s); i {for j : 0; j < i;…...

简单聊一下Oracle,MySQL,postgresql三种锁表的机制,行锁和表锁

MySQL&#xff1a; MySQL使用行级锁定和表级锁定。行级锁定允许多个会话同时写入表&#xff0c;适用于多用户、高并发和OLTP应用。表级锁定只允许一个会话一次更新表&#xff0c;适用于只读、主要读取或单用户应用。 比如mysql开启一个窗口执行 begin; update xc_county_a…...

Python的网络请求

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在上一节中多次提到了URL地址与下载网页&#xff0c;这两项是网络爬虫必备而又关键的功能&#xff0c;说到这两个功能必然会提到HTTP。本节将介绍在P…...

[Shell编程学习路线]——探讨Shell中变量的作用范围(export)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月14日10点14分 &#x1f004;️文章质量&#xff1a;95分 文章目录 ————前言———— 定义变量&#xff1a; 输出变…...

AlertManager解析:构建高效告警系统

一、AlertManager简介 AlertManager是一个开源的告警管理工具&#xff0c;主要用于处理来自于监控系统&#xff08;如Prometheus&#xff09;的告警。它的设计目标是提供一个统一的告警处理平台&#xff0c;能够集中管理告警的路由、去重、分组和通知等操作。在现代云服务架构中…...

打造专属 Switch 模拟游戏机

文章目录 2种方案Switch版RetroArchLakka系统 整体性能对比&#xff1a;Lakka更优核心是否兼容&#xff1a;并不兼容整合2种方案&#xff1a;共享游戏ROM和配置、资源等文件夹临时修改Samba共享整个Lakka系统根目录 存储空间优化添加模拟器核心Switch版RetroArchLakka 添加游戏…...

如何使用Python中的type()函数和isinstance()函数

在Python中&#xff0c;type()函数和isinstance()函数都用于确定一个对象的类型&#xff0c;但它们在用法和目的上有所不同。 1. type()函数 type()函数返回对象的数据类型&#xff08;或类&#xff09;。它接受一个参数&#xff08;即要检查的对象&#xff09;&#xff0c;并…...

【LeetCode刷题】前缀和解决问题:560.和为k的子数组

【LeetCode刷题】Day 16 题目1&#xff1a;560.和为k的子数组思路分析&#xff1a;思路1&#xff1a;前缀和 哈希表 题目1&#xff1a;560.和为k的子数组 思路分析&#xff1a; 问题1&#xff1a;怎样找到数组所有子数组&#xff1f; 方式一&#xff1a;暴力枚举出来&#x…...

DTU在城市智慧供热上的应用:引领供热行业的智能化革新

随着城市化的快速推进和人们对舒适生活需求的日益增长&#xff0c;供热系统作为城市基础设施的重要组成部分&#xff0c;其智能化、高效化的发展已成为必然趋势。在这一进程中&#xff0c;DTU&#xff08;Data Transfer Unit&#xff0c;数据传输单元&#xff09;以其独特的优势…...

LeetCode | 58.最后一个单词的长度

这道题要求最后一个单词的长度&#xff0c;第一个想到的就是反向遍历字符串&#xff0c;寻找最后一个单词并计算其长度。由于尾部可能会有’ &#xff0c;所以我们从后往前遍历字符串&#xff0c;找到第一个非空格的字符&#xff0c;然后记录下到下一个空格前依次有多少个字母即…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...