【详细】linux 打包QT程序

【详细】linux 打包QT程序

    • 一. 安装linuxdeployqt
      • 1.1 下载linuxdeployqt源码并修改如下
    • 二. 安装patchelf
    • 三. 打包appimage
    • 四. 打包成 Debian包
      • 4.1 control文件内容
      • 4.2 postinst文件内容
      • 4.3 postrm文件内容
      • 4.4 打包命令
      • 4.4 安装命令
      • 4.5 卸载命令

一. 安装linuxdeployqt

下载地址:https://github.com/probonopd/linuxdeployqt/releases

注意,直接使用官网版本后面打包会提示你系统版本太新不可用,错误提示如下:

linuxdeployqt 5 (commit fc64c50), build 609 built on 2023-01-06 03:55:18 UTC
Please run on a system no newer than the oldest still-supported Ubuntu LTS release.
This is so that the resulting bundle can run on all still-supported releases of Ubuntu.

下面是解决方案:

1.1 下载linuxdeployqt源码并修改如下

git clone https://github.com/probonopd/linuxdeployqt.git
cd ./linuxdeployqt/tools/linuxdeployqt
  1. 源码下的cmaklists第八行开始的位置删掉如下代码:
find_program(GIT git)if("${GIT}" STREQUAL "GIT-NOTFOUND")message(WARNING "Could not find git, commit and tag info cannot be updated")if(NOT GIT_COMMIT)message(FATAL_ERROR "Commit ID not set, please call with -DGIT_COMMIT=...")endif()if(NOT GIT_TAG_NAME)message(FATAL_ERROR "Tag name not set, please call with -DGIT_TAG_NAME=...")endif()
else()# make sure Git revision ID and latest tag is not stored in the CMake cache# otherwise, one would have to reset the CMake cache on every new commit to make sure the Git commit ID is up to dateunset(GIT_COMMIT CACHE)unset(GIT_LATEST_TAG CACHE)# read Git revision ID and latest tag numberexecute_process(COMMAND "${GIT}" rev-parse --short HEADWORKING_DIRECTORY ${PROJECT_SOURCE_DIR}OUTPUT_VARIABLE GIT_COMMITOUTPUT_STRIP_TRAILING_WHITESPACERESULT_VARIABLE GIT_COMMIT_RESULT)if(NOT GIT_COMMIT_RESULT EQUAL 0)message(FATAL_ERROR "Failed to determine git commit ID")endif()mark_as_advanced(GIT_COMMIT GIT_COMMIT_RESULT)execute_process(COMMAND "${GIT}" rev-list --tags --skip=1 --max-count=1WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}OUTPUT_VARIABLE GIT_TAG_IDOUTPUT_STRIP_TRAILING_WHITESPACERESULT_VARIABLE GIT_TAG_ID_RESULT)if(NOT GIT_TAG_ID_RESULT EQUAL 0)message(FATAL_ERROR "Failed to determine git tag ID")endif()mark_as_advanced(GIT_TAG_ID GIT_TAG_ID_RESULT)execute_process(COMMAND "${GIT}" describe --tags ${GIT_TAG_ID} --abbrev=0WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}OUTPUT_VARIABLE GIT_TAG_NAMEOUTPUT_STRIP_TRAILING_WHITESPACERESULT_VARIABLE GIT_TAG_NAME_RESULT)if(NOT GIT_TAG_NAME_RESULT EQUAL 0)message(FATAL_ERROR "Failed to determine git tag name")endif()mark_as_advanced(GIT_TAG_NAME GIT_TAG_NAME_RESULT)
endif()
  1. linuxdeployqt/tools/linuxdeployqt/main.cpp删掉:
if (strverscmp (glcv, "2.28") >= 0) {qInfo() << "ERROR: The host system is too new.";qInfo() << "Please run on a system with a glibc version no newer than what comes with the oldest";qInfo() << "currently still-supported mainstream distribution (Ubuntu Bionic), which is glibc 2.27.";qInfo() << "This is so that the resulting bundle will work on most still-supported Linux distributions.";qInfo() << "For more information, please see";qInfo() << "https://github.com/probonopd/linuxdeployqt/issues/340";return 1;
}
  1. linuxdeployqt/tools/linuxdeployqt/cmakelists.txt删掉:
if(NOT EXCLUDELIST_RESULT EQUAL 0)message(WARNING "Updating excludelist failed, using outdated copy")
endif()

执行构建

cd ./../../        #跳转到源码根目录
cmake .
cmake --build .

显示如下即为成功
在这里插入图片描述
在linuxdeployqt/tools/linuxdeployqt文件夹下生成了linuxdeployqt程序:
在这里插入图片描述

1.2安装linuxdeployqt到系统

cd ./tool/linuxdeployqt

在linuxdeployqt所在的目录,执行

cp ./linuxdeployqt /usr/local/bin/linuxdeployqt

参考:解决linuxdeployqt报错——系统版本过新的问题

二. 安装patchelf

下载地址:https://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.gz

下载完成后解压,进入到patcherlf-0.9目录,在该目录下命令行输入以下命令:

./configure
make
sudo make install

以上命令执行完之后,进入到/usr/local/bin输入ls命令:
在这里插入图片描述
可以看到目录下会出现patchelf和linuxdeployqt文件。

参考:Linux下使用appimage打包程序

三. 打包appimage

新建一个文件夹,整体结构如下

source
├── DEBIAN
│   └── control
│   └── postinst
│   └── postrm
├── opt└── App├── app   //QT编译完成的release程序└── xxx   //其他文件

把QtCreator Release模式下编译的可执行文件拷贝到source/opt/App/中。
进入该目录下执行:

sudo linuxdeployqt app -appimage

该目录下即会生成一堆程序运行所需要的文件,此时的文件夹移植到其他同系统的计算机,程序也是可以正常使用的。

参考:Linux下Qt程序的打包发布

四. 打包成 Debian包

注意以下文件无后缀名

4.1 control文件内容

Package: mytest
Version: 0.1.0
Section: utils
Priority: optional
Architecture: amd64
Depends:
Installed-Size: 512
Maintainer: 123@163.com
Description: my test package

control文件主要描述软件包的名称(Package),版本(Version),Installed-Size(大小),Maintainer(打包人和联系方式)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引。

4.2 postinst文件内容

#!/bin/sh
chmod 777 /opt/Test/Test.desktop
cp /opt/Test/Test.desktop /usr/share/applications/
cp /opt/Test/Test.desktop ~/Desktop/

该脚本内容主要是要在Desktop目录下,自动生成桌面快捷方式。在applications目录下,显示到已安装应用。
修改postinst文件权限:

chmod 775 postinst

4.3 postrm文件内容

#!/bin/sh
rm /usr/share/applications/Test.desktop
rm ~/Desktop/Test.desktop

该脚本作用于卸载的时候删除postinst创建的2个文件。
修改postrm文件权限:

chmod 775 postrm

4.4 打包命令

对source目录下执行:

dpkg -b . ./test_amd64_0.1.0.deb

test_amd64_0.1.0.deb为自己命名,会打包在当前source目录下。deb包到此即打包完成。

4.4 安装命令

sudo dpkg -i test_amd64_0.1.0.deb

4.5 卸载命令

sudo dpkg -r test_amd64_0.1.0.deb

参考:使用linuxdeployqt在linux下进行Qt打包发布(超详细)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gin框架接入Prometheus,grafana辅助pprof检测内存泄露

prometheus与grafana的安装 grom接入Prometheus,grafana-CSDN博客 Prometheus 动态加载 我们想给Prometheus新增监听任务新增ginapp项目只需要在原来的配置文件下面新增ginapp相关metric 在docker compose文件下面新增 执行 docker-compose up -d curl -X POST http://lo…

复现dom破坏案例和靶场

文章目录 靶场网址第一个实验步骤和原理(代码为示例要根据自己的实验修改) 第二个实验步骤和原理(代码为示例要根据自己的实验修改) 靶场网址 注册后点击 第一个实验 此实验室包含一个 DOM 破坏漏洞。注释功能允许“安全”HTML。为了解决这个实验&#xff0c;请构造一个 HT…

依赖注入+中央事件总线:Vue 3组件通信新玩法

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-依赖注入-中央事件总线 目录 中央事件总线使用 依赖注入使用 总结 中央事件总线 依赖注入…

【TiDB】09-修改tidb客户端访问密码

目录 1、修改配置文件 2、停止tidb-server 3、以root方式启动脚本 4、修改密码 5、停止脚本重启服务 1、修改配置文件 进入tidb-server默认部署位置 #切换tidb账号 su tidb# 进入tidb-server部署路径 cd /tidb-deploy/tidb-4000# 修改配置 vim ./conf/tidb.toml添加内容…

Datawhale AI 夏令营 第四期 AIGC Task3

活动简介 活动链接&#xff1a;Datawhale AI 夏令营&#xff08;第四期&#xff09; 以及AIGC里面的本次任务说明&#xff1a;Task 3 进阶上分-实战优化 这次任务呢&#xff0c;主要是对知识的一个讲解&#xff0c;包括ComfyUI工具的使用啊&#xff0c;以及LoRA的原理啊&…

学习记录第三十天

管道&#xff1a; 无名管道&#xff1a;只能用于亲缘关系进程之间的通信&#xff1a; 有名管道&#xff1a;是一种特殊的文件&#xff0c;存在于内存中&#xff0c;在系统中有对应的名称&#xff0c;文件大小为0字节&#xff1b; 编程&#xff1a; Linux系统中&#xff0c;…

Deepin-获取屏幕缩放比例

Deepin-获取屏幕缩放比例 一、概述二、实现代码 一、概述 环境&#xff1a;UOS、Deepin 我的目的是为了获取屏幕的缩放比例值&#xff0c;就是获取如下的值 我们可以去读取当前的环境变量值&#xff0c;在Qt Creator中可以看到这个值 二、实现代码 相关的Qt接口如下&…

串口通信协议(hal库)

目录 串口通信协议 串行/并行 同步/异步 单工/半双工/全双工 DR寄存器 轮询方式 中断方式 主要中断事件&#xff1a; DMA方式 USART 模块的常用 HAL 库常用接口函数 串口通信协议 串口通信&#xff08;Serial Communication&#xff09;指的是数据通过一个串行的通道…

前端如何使用Nginx代理dist网页,代理websocket,代理后端

本文将指导您如何配置Nginx以代理前后端分离的项目&#xff0c;并特别说明了对WebSocket的代理设置。通过本教程&#xff0c;您将能够实现一次性配置&#xff0c;进而使项目能够在任意局域网服务器上部署&#xff0c;并可通过IP地址或域名访问服务。 笔者建议 先速览本文了解大…

Java、python、php版的企业单位考勤打卡管理系统的设计与实现(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

C语言-使用数组法,指针法实现将一个5X5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下,从小到大存放),写一函数实现之。

1.题目要求&#xff1a; 将一个5X5的矩阵中最大的元素放在中心&#xff0c;四个角分别放四个最小的元素&#xff08;顺序为从左到右&#xff0c;从上到下&#xff0c;从小到大存放&#xff09;&#xff0c;写一函数实现之。 2.数组法实现 #define _CRT_SECURE_NO_WARNINGS 1…

【自动驾驶】控制算法(一)绪论与前期准备

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

ROW_NUMBER(), RANK(), DENSE_RANK() SQL排序函数图文详解

ROW_NUMBER(), RANK(), DENSE_RANK() ROW_NUMBER(): 为结果集中的每一行分配唯一的连续编号。即使有重复的值&#xff0c;ROW_NUMBER() 也会为它们分配不同的序号。 SELECT column_name, ROW_NUMBER() OVER (ORDER BY column_name) AS row_num FROM table_name;2. RANK(): 对结…

2-68 基于matlab的小波分解子模式和盒维数的车型识别程序

基于matlab的小波分解子模式和盒维数的车型识别程序&#xff0c;可以选择不同车型&#xff0c;包括小车、中车、大车。GUI可视化界面操作&#xff0c;已包括多种图片。程序已调通&#xff0c;可直接运行。 2-68 小波分解子模式和盒维数 - 小红书 (xiaohongshu.com)

RabbitMQ实现多线程处理接收消息

前言&#xff1a;在使用RabbitListener注解来指定消费方法的时候&#xff0c;默认情况是单线程去监听队列&#xff0c;但是这个如果在高并发的场景中会出现很多个任务&#xff0c;但是每次只消费一个消息&#xff0c;就会很缓慢。单线程处理消息容易引起消息处理缓慢&#xff0…

深度学习(YOLO、DETR) 十折交叉验证

二&#xff1a;交叉验证 在 K 折验证之前最常用的验证方法就是交叉验证&#xff0c;即把数据划分为训练集、验证集和测试集。一般的划分比例为 7&#xff1a;1&#xff1a;2。但如何合理的抽取样本就成为了使用交叉验证的难点&#xff0c;不同的抽取方法会导致截然不同的训练性…

c语言学习,malloc()函数分析

1&#xff1a;malloc() 函数说明&#xff1a; 申请配置size大小内存空间 2&#xff1a;函数原型&#xff1a; void *malloc(size_t size) 3&#xff1a;函数参数&#xff1a; 参数size&#xff0c;为申请内存大小 4&#xff1a;返回值&#xff1a; 配置成功则返回指针&#…

Nginx实验

编译安装 Nginx 准备rhel9环境 下载安装包nginx-1.24.0&#xff08;xftp&#xff09;/复制下载链接 &#xff08;nginx.org——>download&#xff09; 解压 [rootnginx nginx-1.24.0]# tar zxf nginx-1.24.0.tar.gz [rootnginx nginx-1.24.0]#tar zxf nginx-1.24.0.tar.…

[掘金社区]自动签到脚本

直接上脚本 脚本临时写的&#xff0c;今天是运行的第一天&#xff0c;虽然报错编码,但是签到、抽奖都成功了。 下面是修改了之后的版本。 # -*- coding: utf-8 -*- import requests import logginglogging.basicConfig(levellogging.INFO)def check_sign_in_status(base_url,h…

Clobbering DOM attributes to bypass HTML filters

目录 寻找注入点 代码分析 payload构造 注入结果 寻找注入点 DOM破坏肯定是出现在js文件中&#xff0c;我们首先来看源码 /resources/labheader/js/labHeader.js这个源码没什么问题我们重点关注在下面两个源码上 /resources/js/loadCommentsWithHtmlJanitor.js这个源码中重…