不借助第三方工具打包QT程序

准备工作:

项目/可执行文件名:QTAppName

打包项目存放的文件名:pack(这个文件名无所谓)

脚本名:

copylib.sh(类似ldd命令):用于将.so库文件的依赖项复制并放入自动生成的 “lib文件” 中。

QTAppName.sh(注:该脚本名为"可执行文件名.sh")“:用于最后执行可执行文件的脚本

  1. 将Qt项目使用Release模式编译运行一遍,确保生成可执行文件 QTAppName
  2. 脚本编写:

copylib.sh

#!/bin/bash
LibDir=$PWD"/lib"
Target=$1lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))$(mkdir $LibDir)
for Variable in ${lib_array[@]}
docp "$Variable" $LibDir
done

QTAppName.sh

#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`dirname=`dirname $0`
tmp="${dirname#?}"if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
  1. 权限给予

chmod 777 copylib.sh QTAppName.sh

开始打包

  1. 获得可执行文件的依赖

  • 将copylib.sh拷贝进对应项目的构建/build目录(例如:build-SmartCheckImgWidget_4_3-Desktop_Qt_5_15_2_GCC_64bit-Release)
  • 在Terminal中,输入./copylib.sh QTAppName
  • 将① QTAppName的可执行程序、② lib文件夹里面全部的文件**(不是直接复制lib文件夹,是文件夹的内容)** 复制到 pack文件夹中;
  • 复制完毕后,将lib文件夹删除即可。
  1. 获取Qt依赖

  • 进入Qt的安装目录,并将copylib.sh拷贝qt中的platforms目录下(我的目录:/opt/Qt/5.15.2/gcc_64/plugins/platforms)。
  • 执行 ./copylib.sh libqxcb.so(注:xcb是移植的重要文件,如果拷贝错误将不能在目标主机运行。)
  • 回到plugins(platforms的上级目录)将platforms整个文件夹拷贝到pack
  • 将libqxcb.so依赖库文件夹pack/platforms/lib/*)的东西全部放到pack目录下(可能会有重复项替换即可)。并删除pack/platforms/lib文件夹及其所属文件。(最后记得将原来Qt/5.15.2/gcc_64/plugins/platform/lib也删除了,虽然不删除也没啥事)
  1. 其他 + 扫尾工作

若是还有其他依赖项目,如:所编写的程序有操作数据库的动作,还需要将与platforms同级目录中的sqldrivers文件夹也拷贝到“pack文件夹”中

QTAppName.sh放入pack,并使用 ./QTAppName.sh 调用测试是否成功

可能问题:

问题一:打包后在其他设备上尝试 ./QTAppName.sh 运行,报错Inconsistency detected by ld.so: dl-deps.c: 622: _dl_map_object_deps: Assertion `nlist > 1‘ failed!

解决方案:该问题大概率是由libc(该库是linux底层的一个基本库)的版本不一致导致的,可以使用以下命令查看libc版本

ldd --version

在这里插入图片描述

若是版本不一致可以尝试更新libc6,但是并不推荐该方法,因为这是一个底层库这样做可能有风险,且该库的高版本并不一定兼容低版本,手动安装指定版本,系统可能会在安装的过程中崩溃。

sudo apt-get update
sudo apt-get install libc6

**推荐方法:**使打包主机和运行的环境主机的版本号(不是内核版本)一致,且没有更新过

cat /etc/os-release    //可以查看发行版本

问题二:依赖缺失

解决方案:

  • 模块缺失在上文的开始打包中仿照Qt依赖项的获取,添加对应的依赖即可
  • .so库的依赖缺失:使用ldd命令,查看库的依赖情况
ldd 依赖库名.so

决方案:

  • 模块缺失在上文的开始打包中仿照Qt依赖项的获取,添加对应的依赖即可
  • .so库的依赖缺失:使用ldd命令,查看库的依赖情况
ldd 依赖库名.so

尝试使用find查询打包主机上对应依赖项,并添加

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

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

相关文章

vscode远程免密登录ssh

vscode远程免密登录ssh 1. 安装vscode2. 安装ssh3. 本地vscode配置免密登录远端开发机1. 本地配置秘钥2. 远程开发机配置秘钥 4. vscode常用小工具1. vscode怎么设置ctrl加滚轮放大字体 1. 安装vscode 2. 安装ssh 设置符号打开config配置文件,点击符号ssh连接新的远…

4. Django 探究FBV视图

4. 探究FBV视图 视图(Views)是Django的MTV架构模式的V部分, 主要负责处理用户请求和生成相应的响应内容, 然后在页面或其他类型文档中显示. 也可以理解为视图是MVC架构里面的C部分(控制器), 主要处理功能和业务上的逻辑. 我们习惯使用视图函数处理HTTP请求, 即在视图里定义def…

Oracle使用regexp_like报错ORA-12733 正则表达式太长

注:此篇内容并没有解决正则表达式太长的问题。 在命令行窗口连接数据库: >sqlplus username/passwordhostname:port/SID或service_name 其中: username 是你的数据库用户名。 password 是你的数据库密码。 hostname 是数据库服务器的…

利用机器学习库做动态定价策略的例子

动态定价是一个复杂的问题,涉及到市场需求、库存、竞争对手行为、季节性因素等多个变量。在实际应用中,动态定价通常需要复杂的模型和大量的数据分析。我选择使用Python(Golearn库)进行机器学习模型的训练和部署,而将G…

简述VPS 与 Apache 搭建网站方式对比:新手科普指南

在互联网时代,拥有一个网站对于个人、企业以及组织来说已经成为了必备的一项资源。然而,对于新手来说,如何搭建一个网站可能是一个挑战。在这篇文章中,我将探讨两种常见的搭建网站的方式:使用虚拟专用服务器&#xff0…

A complete evaluation of the Chinese IP geolocation databases(2015年)

下载地址:A Complete Evaluation of the Chinese IP Geolocation Databases | IEEE Conference Publication | IEEE Xplore 被引用次数:12 Li H, He Y, ** R, et al. A complete evaluation of the Chinese IP geolocation databases[C]//2015 8th International Conference…

chatgpt Team 4.0共享合租账号的新方式

为了更好地满足工作需求,我订阅了GPT PLUS会员,但我发现,4.0每三小时问答40次经常吃灰,而且每月近200元的费用让我感到有点肉痛。 于是,我开始寻找有没有什么替代品。在逛某论坛的时候,发现了一个共享Team…

2024年MathorCup数学应用挑战赛A题思路分析

文章目录 题目简介题目背景和重要性题目要求和目标 题目分析和解题思路理解PCI规划的基本原则PCI参考算法 建立数学模型定义决策变量建立目标函数确定约束条件唯一性约束:确保每个小区的PCI在整个网络中是唯一的。 设计优化算法目标函数分析约束条件分析问题规模分析…

ClickHouse 与 MySQL 介绍与比较

ClickHouse 与 MySQL 介绍与比较 一、ClickHouse简介 ClickHouse是由Yandex开发的开源列式数据库管理系统(DBMS)。它是专门为在线分析处理(OLAP)任务设计的,可以使用SQL查询语言处理高速数据。ClickHouse的列式存储方式让它在处理大数据分析任务时表现出卓越的速度…

python抠图程序

import cv2 import numpy as np def color_threshold(image, lower, upper): hsv_image cv2.cvtColor(image, cv2.COLOR_BGR2HSV) mask cv2.inRange(hsv_image, lower, upper) result cv2.bitwise_and(image, image, maskmask) return result # 读取图片…

客户端传日期格式字段(String),服务端接口使用java.util.Date类型接收报错问题

客户端传日期格式字段(string),服务端接口使用java.util.Date类型接收报错问题 问题演示第1种:客户端以URL拼接的方式传值第2种:客户端以body中的form-data方式提交第3种 客户端以Body中的json方式提交 问题解决(全局解…

softmax回归:多分类问题的解码器

随着人工智能技术的不断发展,分类问题在机器学习领域中的地位日益凸显。在众多分类算法中,softmax回归以其独特的优势和广泛的应用场景,成为了处理多分类问题的有力工具。本文将深入探讨softmax回归的原理、应用及其优缺点,以期为…

【24届数字IC秋招总结】提前批面试经验1——小米、百度昆仑芯、长鑫存储

文章目录 前言一、小米-SOC验证工程师1.1 面试问题二、百度昆仑芯-芯片验证工程师2.1 一面面试问题2.2 二面面试问题三、长鑫存储-数字电路前言 提前批面试公司:小米、百度昆仑芯、长鑫存储 一、小米-SOC验证工程师 面试时间:7.23 周末 1.1 面试问题 1、 问研究生项目,自…

【Django】必须登陆才能访问功能实现

一、直接使用session传递登录状态(不推荐,但能用) 这是最简单、最直接的方法。 1.登录视图添加标识 添加登录状态标识 request.session[is_logged_in] False def user_login(request):# 这是一个登录状态标识request.session[is_logged_in] Falseif request.…

pytorch-多分类实战之手写数字识别

目录 1. 网络设计2. 代码实现2.1 网络代码2.2 train 3. 完整代码 1. 网络设计 输入是手写数字图片28x28,输出是10个分类0~9,有两个隐藏层,如下图所示: 2. 代码实现 2.1 网络代码 第一层将784降维到200,第二次使用…

oracle表误删恢复

update误更新表恢复: UPDATE sysuser a SET dept(SELECT jjxm FROM z_temp20190313 b WHERE b.sbbma.dept) WHERE useful1 AND dept IS NOT NULL 查询sysuser表最后dml操作时间: select max(ora_rowscn),to_char(scn_to_timestamp(max(ora_rowscn)),y…

以Centos7为例,监控SSD硬盘的I/O性能,分析硬盘的读写数据

监控SSD硬盘的I/O性能可以通过多种工具和命令来实现。在CentOS 7系统中,以下是一些常用的方法来监控SSD的I/O性能: 使用iostat命令: iostat是sysstat包的一部分,可以报告CPU统计信息和所有块设备的I/O统计信息。要安装sysstat包&a…

ChatGPT基础(二) ChatGPT的使用和调优

文章目录 ChatGPT的特性采用关键词进行提问给ChatGPT指定身份提升问答质量的策略1.表述方式上的优化2.用"继续"输出长内容3.营造场景4.由浅入深,提升问题质量5.预设回答框架和风格 ChatGPT的特性 1.能够联系上下文进行回答 ChatGPT回答问题是有上下文的&…

uni-app web端使用getUserMedia,摄像头拍照

<template><view><video id"video"></video></view> </template> 摄像头显示在video标签上 var opts {audio: false,video: true }navigator.mediaDevices.getUserMedia(opts).then((stream)> {video document.querySelec…

【python】在pycharm创建一个新的项目

双击打开pycharm,选择create new project 选择create,后进入项目 右键项目根目录,选择new一个新的python file 随意命名一下 输入p 然后后面就会出现智能补全提示,此时轻敲一下tab,代码就写好了,非常的方便 右键执行一下代码,下面两个直接运行和debug运行都是可以的 小结 …