【详细】linux 打包QT程序

news2024/12/29 10:37:21

【详细】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 date
    unset(GIT_COMMIT CACHE)
    unset(GIT_LATEST_TAG CACHE)

    # read Git revision ID and latest tag number
    execute_process(
        COMMAND "${GIT}" rev-parse --short HEAD
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        OUTPUT_VARIABLE GIT_COMMIT
        OUTPUT_STRIP_TRAILING_WHITESPACE
        RESULT_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=1
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        OUTPUT_VARIABLE GIT_TAG_ID
        OUTPUT_STRIP_TRAILING_WHITESPACE
        RESULT_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=0
        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
        OUTPUT_VARIABLE GIT_TAG_NAME
        OUTPUT_STRIP_TRAILING_WHITESPACE
        RESULT_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.coloradmin.cn/o/2046085.html

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

相关文章

【Redis】Redis 数据类型与结构—(二)

Redis 数据类型与结构 一、值的数据类型二、键值对数据结构三、集合数据操作效率 一、值的数据类型 Redis “快”取决于两方面&#xff0c;一方面&#xff0c;它是内存数据库&#xff0c;另一方面&#xff0c;则是高效的数据结构。 Redis 键值对中值的数据类型&#xff0c;也…

被极氪“背刺”新能源汽车车主,你可以说不

文 魏强 导语&#xff1a;谁也改变不了不断被“背刺”的命运。 8月13日晚&#xff0c;极氪召开发布会主推两款改款车——2025款极氪007升级了第二代金砖电池&#xff08;磷酸铁锂&#xff09;、标配了激光雷达和两颗Orin X芯片、全系降价2-3万元。2025款极氪001智驾芯片从Mob…

Artifactory集成LDAP示例

LDAP在企业软件身份认证中起到了非常关键的作用&#xff0c;给企业内用户带来了非常多的便利&#xff0c;JFrog 平台支持针对开箱即用的 LDAP 服务器对用户进行身份验证。下面我们一起看下Artifactory如何集成LDAP&#xff0c;本示例以OpenLDAP为例。 1.快速安装OpenLDAP doc…

SqlSugar详解-国产ORM框架

ORM (Object-Relational Mapping) 概念 ORM 是一种程序技术&#xff0c;用于将关系型数据库中的数据映射到对象上。 主要目的是简化数据库操作&#xff0c;使得开发人员可以像操作对象一样来操作数据库。 原理 数据表与类的映射&#xff1a;数据库中的表对应为类。 记录与对象…

灵办AI助手Chrome插件全面评测:PC Web端的智能办公利器

探索灵办AI助手在Mac OS上的高效表现&#xff0c;支持多款主流浏览器&#xff0c;助你轻松应对办公挑战 文章目录 探索灵办AI助手在Mac OS上的高效表现&#xff0c;支持多款主流浏览器&#xff0c;助你轻松应对办公挑战摘要引言开发环境介绍核心功能评测1. 网页翻译与双语对照 …

【祖孙询问】

问题 代码 #include <bits/stdc.h> using namespace std; const int N 4e410; vector<int> edge[N]; int p[N][20], d[N]; void dfs(int from, int u) {for(auto to : edge[u]){if(to from) continue;d[to] d[u] 1;p[to][0] u;dfs(u, to);}} void init() {fo…

mysql主从同步遇到的问题

1&#xff0c;主库data文件复制到从库&#xff0c;之后主库要同步的实例data一定不要在修改&#xff1b; 1.1&#xff0c;修改之后就要重新覆盖一遍 2&#xff0c;如果状态不对&#xff1a;一定要查看日志&#xff1b;比如slave_io_state是空时&#xff0c;需要查看日志 2.1&a…

使用百度文心智能体创建AI旅游助手

百度文心智能体平台为你开启。百度文心智能体平台&#xff0c;创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台&#xff0c;集成了先进的自然语言处理技术和人工智能技术&#xff0c;可以用来创建属于自己的智能体应用&#xff0c;访问官网链接&#xff1…

查看电脑连接过的wifi密码

netsh wlan show profiles netsh wlan show profile name"8821" keyclear

用Python实现9大回归算法详解——01. 线形回归算法

1. 线性回归的基本概念 线性回归是一种最基本的监督学习算法&#xff0c;用于预测因变量&#xff08;目标变量&#xff09;和一个或多个自变量&#xff08;特征变量&#xff09;之间的关系。线性回归假设因变量与自变量之间的关系是线性的&#xff0c;即可以用以下形式的线性方…

写一个githubDemo

1.List组件 <template><div class"container"><!-- 展示用户列表 --><div class"row"><divv-show"info.users.length"v-for"(item, index) in info.users":key"item.id"><div class"…

使用Python对知识文本进行分块

使用大型语言模型时&#xff0c;切勿忽略文本分块的重要性&#xff0c;其对处理结果的好坏有重大影响。接下来介绍常用的一些文本分块方法。1.1 一般的文本分块方法 如果不借助任何包&#xff0c;直接按限制长度切分方案。 text " 我是一个名为 chatGLm3-68 的人工智能助…

wps云字库字体下载到电脑

下拉字体菜单栏--->查看更多云字体 进入后 云字库里的字体&#xff0c;都只能在wps在线使用。 但是&#xff0c;要想下载到自己的电脑上&#xff0c;安装到电脑系统字体库中&#xff0c;WIN7的字体安装系统路径&#xff1a;C:\Windows\Fonts&#xff0c;以供电脑软件adobe …

Spring IoCDI(上)--初识

1. IoC & DI ⼊⻔ 1.1 Spring 是什么 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场 景, 有着活跃⽽庞⼤的社区, 我们⽤⼀句更具体的话来概括Spring, 那就是: Spring 是包含了众多⼯具⽅法的 IoC 容器 1.1.1 什么是容器…

C#委托(入门)

1、语法 步骤 ①定义一个委托类型, 如Help ②委托类型实例化为委托实例 ③定义函数(与委托类型相匹配的) ④将函数交给委托实例使用 示例一 //方法一 void MyFunc1() {Console.WriteLine("Hello"); }//方法二 void MyFunc2() {Console.WriteLine("World&…

STM32总线和时钟树(速记版)

一、存储器结构 1.1 STM32内存结构 型号说明 以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff0c;其命名规则如下&#xff1a; ST 是公司名&#xff0c;意法半导体。M 代表Cortex-M内核。32 代表32位微控制器。 F103 是芯片系列。 R 代表引脚数…

算法基础知识——11种距离度量

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 前言&#xff1a;距离的作用 数据聚类&#xff1a;距离度量在聚类算法&#xff08;如K-means、层次聚类&#xff09;中用于衡量数据点之间的相似性或差异性&#xff0c;帮助确定聚类的中心和边界…

10款开源管理工具大比拼:哪个最适合您的团队?

国内外主流的 10 款开源项目管理系统对比&#xff1a;PingCode、Worktile、Gitee、开源中国 (OSChina)、禅道 (ZenTao)、OpenProject、Redmine、Leantime、MeisterTask、Freedcamp。 在选择合适的开源项目管理工具时&#xff0c;你是否感到困惑和不安&#xff1f;市场上众多的选…

Python | Leetcode Python题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; class Solution:def countBits(self, n: int) -> List[int]:bits [0]for i in range(1, n 1):bits.append(bits[i & (i - 1)] 1)return bits

SSTI模版注入(初步)

SSTI模版注入&#xff08;初步&#xff09; ssti可能造成任意文件读取和RCE远程控制后台系统 漏洞成因&#xff1a;渲染模版时&#xff0c;没有严格控制对用户的输入&#xff1b; 使用了危险的模版&#xff0c;导致用户可以混合flask程序进行交互。 flask是基于python开发的…