Linux下Qt程序打包发布

如何打包

注意事项

可能遇到的问题

如何打包:

        1、先下载linuxdeployqt工具,下载链接:https://github.com/probonopd/linuxdeployqt/releases

        选择最后release的版本,然后执行命令:       

sudo chmod 777 linuxdeployqt-countinuous-x86_64.AppImage

        2、将文件copy到执行目录下,然后再通过查看版本号来确认是否成功。以后在终端可以随时使用。       

sudo cp linuxdeployqt-countinuous-x86_64.AppImage /usr/local/bin/linuxdeployqt

        查看版本信息如下:       

admit:~$ linuxdeployqt -version
linuxdeployqt  (commit 2b38449), build 62 built on 2023-12-27 21:00:01 UTC

        3、查看qtchooser是否已安装,如果没安装的话通过下面命令安装:

        sudo apt install qtchooser

        4、检查qmake环境变量。运行命令查看qmake是否配置正确:               

auto@auto-PN41:~$ qmake -v
QMake version 3.1
Using Qt version 5.14.0 in /opt/qt5.14/5.14.0/gcc_64/lib

        如果报错找不到或者不能正确输出版本号信息,则编辑 ~/.bashrc文件,在文件末尾添加如下信息:注意,根据自己电脑的实际信息替换相关路径       

#add qt env
export PATH=/opt/qt5.14/5.14.0/gcc_64/bin:$PATH
export LIB_PATH=/opt/qt5.14/5.14.0/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/opt/qt5.14/5.14.0/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/opt/qt5.14/5.14.0/gcc_64/qml:$QML2_PATH

        然后执行命令使其生效(这种更改只会影响到当前用户):

        source ~/.bashrc

        5、对可执行文件进行打包。首先mkdir 一个release文件夹,然后将可执行文件放进去,再执行命令:      

               linuxdeployqt YourApp -appimage

        静待一会,命令执行完成后发现文件夹中多了很多文件:       

elease/test$ ls -l 
lrwxrwxrwx 1 auto auto    12 3月   6 14:57 AppRun -> LogParseTool
-rw-rw-r-- 1 auto auto   123 3月   6 14:57 default.desktop
-rw-rw-r-- 1 auto auto     0 3月   6 14:57 default.png
drwxrwxr-x 7 auto auto  4096 3月   6 14:57 doc
drwxrwxr-x 2 auto auto  4096 3月   6 14:57 lib
-rwxrwxr-x 1 auto auto 54408 3月   6 14:57 LogParseTool
drwxrwxr-x 7 auto auto  4096 3月   6 14:57 plugins
-rw-rw-r-- 1 auto auto   145 3月   6 14:57 qt.conf
drwxrwxr-x 2 auto auto  4096 3月   6 14:57 translations

        其中很多文件都可以删掉:

        1) AppRun相当于快捷启动,可以删除

        2) default.desktop,这个一般放在/usr/share/applications中,我们用不到,也可以删除

        3) default.png,程序图标,删除

        4) doc,说明手册,删除

        5) lib,这个存放了依赖库,里面很多文件也是用不到,根据实际情况瘦身

        6) plugins,放了插件,删除用不到的

        7) qt.conf,配置文件,很有用

        8)translations,翻译文件,删除

特别说明:       

        因为linuxdeployqt将在内部使用ldd命令,来确定从何处将库复制到包中。ldd命令本身只能查找隐式加载的so,故若程序中代码使用显式加载的so,它是找不到的,这时需要开发者自己去保证显式加载so的路径可被搜索。
        举个例子:若存在程序A显式加载B.so,B.so隐式加载C.so,则对程序A使用linuxdeployqt拷贝依赖时,程序A的间接依赖文件C.so,将不会被拷贝。当程序跑起来加载B.so时,就会报找不到C.so的错误。这一点尤其需要注意。此时我们需要再对B.so使用一次linuxdeployqt拷贝依赖。这样程序A加载B.so,B.so加载C.so,就都可以找到了。

        我们测试下程序是否可以正常运行:

        1)首先启动一个新的终端,执行export命令,看有哪些环境变量涉及到qt       

auto@auto-PN41:~$ exportdeclare -x COLORTERM="truecolor"
declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
declare -x DESKTOP_SESSION="ubuntu"
declare -x DISPLAY=":0"
declare -x GDMSESSION="ubuntu"
declare -x GJS_DEBUG_OUTPUT="stderr"
declare -x GJS_DEBUG_TOPICS="JS ERROR;JS LOG"
declare -x GNOME_DESKTOP_SESSION_ID="this-is-deprecated"
declare -x GNOME_SHELL_SESSION_MODE="ubuntu"
declare -x GNOME_TERMINAL_SCREEN="/org/gnome/Terminal/screen/45b91e20_a362_407f_aa7e_4864aa4f4d21"
declare -x GNOME_TERMINAL_SERVICE=":1.2881"
declare -x GPG_AGENT_INFO="/run/user/1000/gnupg/S.gpg-agent:0:1"
declare -x GTK_MODULES="gail:atk-bridge"
declare -x IM_CONFIG_PHASE="1"
declare -x LC_TIME="zh_CN.UTF-8"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LIB_PATH="/opt/qt5.14/5.14.0/gcc_64/lib:"
declare -x LOGNAME="auto"
declare -x MANAGERPID="949"
declare -x declare -x PATH="/opt/qt5.14/5.14.0/gcc_64/bin:/home/auto/Anaconda3/bin:/home/auto/anaconda/bin:/home/auto/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"
declare -x PLUGIN_PATH="/opt/qt5.14/5.14.0/gcc_64/plugins:"
declare -x PWD="/home/auto"
declare -x QML2_PATH="/opt/qt5.14/5.14.0/gcc_64/qml:"
declare -x QT_ACCESSIBILITY="1"
declare -x QT_IM_MODULE="ibus"
declare -x SESSION_MANAGER="local/auto-PN41:@/tmp/.ICE-unix/1198,unix/auto-PN41:/tmp/.ICE-unix/1198"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_AGENT_PID="1158"
declare -x SSH_AUTH_SOCK="/run/user/1000/keyring/ssh"
declare -x TERM="xterm-256color"
declare -x USER="auto"
declare -x USERNAME="auto"
declare -x VTE_VERSION="6003"
declare -x WINDOWPATH="2"
declare -x XAUTHORITY="/run/user/1000/gdm/Xauthority"
declare -x XDG_CONFIG_DIRS="/etc/xdg/xdg-ubuntu:/etc/xdg"
declare -x XDG_CURRENT_DESKTOP="ubuntu:GNOME"

        发现有LIB_PATH\QML2_Path等涉及到qt路径的设置,那么先去掉这些设置(不要担心,下面这些设置只会对当前终端生效

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export LIB_PATH=
export PLUGIN_PATH=
export QML2_PATH=

        然后终端运行下./LogParseTool,发现ok

注意事项:

        1、明明已经在当前目录下放好了库,但是程序仍报错找不到库。

        比如当前路径下有这些文件:       

ls -ldrwxrwxr-x 2 auto auto  4096 3月   6 10:42 lib
-rwxrwxr-x 1 auto auto 54408 3月   6 13:50 LogParseTool
drwxrwxr-x 5 auto auto  4096 3月   6 10:28 plugins
-rw-rw-r-- 1 auto auto   126 3月   6 10:41 qt.conf
-rw-rw-r-- 1 auto auto    81 3月   6 13:55 setting.ini

        对程序执行ldd命令后发现使用的库指向了别处地方,此时修改qt.conf,增加:

        Libraries=./

        然后再执行ldd命令,发现引用的库指向了当前文件夹中的Lib文件夹,程序也可以正常启动了。此外,qt.conf中支持哪些关键字的配置呢?       

前面是Key,后面是采用默认的value{ "Prefix", "." },{ "Documentation", "doc" }, // should be ${Data}/doc{ "Headers", "include" },{ "Libraries", "lib" },
#ifdef Q_OS_WIN{ "LibraryExecutables", "bin" },
#else{ "LibraryExecutables", "libexec" }, // should be ${ArchData}/libexec
#endif{ "Binaries", "bin" },{ "Plugins", "plugins" }, // should be ${ArchData}/plugins{ "Imports", "imports" }, // should be ${ArchData}/imports{ "Qml2Imports", "qml" }, // should be ${ArchData}/qml{ "ArchData", "." },{ "Data", "." },{ "Translations", "translations" }, // should be ${Data}/translations{ "Examples", "examples" },{ "Tests", "tests" },
#ifdef QT_BUILD_QMAKE{ "Sysroot", "" },{ "HostBinaries", "bin" },{ "HostLibraries", "lib" },{ "HostData", "." },{ "TargetSpec", "" },{ "HostSpec", "" },{ "HostPrefix", "" },
#endif

可能遇到的问题

1、可执行文件只能通过终端启动?双击运行时报错:

        糟糕!运行这个软件时出现问题。无法定位程序

这种情况下,先又击鼠标查看程序属性,查看程序类型是否是:x-sharedlib。如果是,那么返回程序,进入到.pro配置中,增加下面信息,然后重新编译即可:       

QMAKE_LFLAGS += -no-pie

如果出现简单的程序可以这样解决,但是复杂的程序解决不了,说明是环境问题;因为双击在图形界面,环境是文件管理器,使用./是在命令行界面,也就是shell脚本,shell启动时会执行一些脚本,改变环境变量;复杂工程如果依赖三方库,直接双击可执行是打不开的。那么可以考虑按照下面步骤来:
        修改全局环境变量,把可执行程序当前路径加到如下配置文件(依赖库一般和可执行程序在同级目录):

        命令:sudo vim /etc/ld.so.conf

        将第三方库放到和可执行文件一个目录中,打开 /etc/profile文件,并在文件末尾添加:       

#add qt env
export PATH=/opt/qt5.14/5.14.0/gcc_64/bin:$PATH
export LIB_PATH=/opt/qt5.14/5.14.0/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/opt/qt5.14/5.14.0/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/opt/qt5.14/5.14.0/gcc_64/qml:$QML2_PATH

        保存成功后执行:sudo ldconfig

如果上面方法还是不行呢?还有一个方法,就是通过shell的方式进行:

编辑一个shell脚本,例如是startApp.sh,放在可执行文件目录,内容如下:

#!/bin/bash
#workdir
workdir=$(cd $(dirname $0); pwd)
cd $workdir
./AssistantMainInterface

此时可以在终端./startApp.sh运行程序了,但双击还是打不开。

2、设置shell脚本双击可打开
打开文件管理器-编辑-首选项-行为,勾选“打开可执行文本文件时运行它们”;
右键startApp.sh,选择权限选项卡,勾选允许作为程序执行文件,此时双击“startApp.sh”可直接执行程序;

3、创建桌面快捷方式
为了看上去更像一个程序,创建一个带图标的桌面快捷方式;
在桌面创建文件/root//Desktop/zhushou.desktop,编辑vim zhushou.desktop:

[Desktop Entry]
Encoding=UTF-8
Name=ZhuShou
Comment=tool
#Exec=/root/IPDSys/bin/config/shell/shell_410/rzt_tool_start.sh
Exec=/root/桌面/app1/startApp.sh
Icon=/root/桌面/app1/app.png
Terminal=false
StartupNotify=true
Type=Application
Name[zh_CN]=ZhuShou

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

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

相关文章

webpack编译报错Cannot find module ‘@babel/core‘且无法识别es6的reset语法

~ npm install babel-core babel-loader --save-dev 用了这个指令后webpack报错 尝试重新下载了babel-core babel-loader 还是不行 Cannot find module babel/core babel-loader8 requires Babel 7.x (the package babel/core). If youd like to use Babel 6.x (babel-core), …

Gson(List<Object>转String 、String转List<Object>)

要在Java项目中使用Gson库&#xff0c;你需要添加相应的依赖项。以下是在Maven项目的pom.xml文件中添加Gson依赖的示例&#xff1a; <dependencies><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId>&l…

Matter 笔记1-环境准备,编译

不要远程登录Ubuntu输入以下命令&#xff0c;原因&#xff1a;ubuntu/linux上的http代理设置 1. 准备 1.1 工具 Ubuntu 22.04 LTSClash 里General的端口设置到ubuntu 的网络设置里 1.2 代码 这里使用芯科整理过的代码 git clone https://github.com/SiliconLabs/matter.…

3. springboot中集成部署vue3

1. vue3构建 构建命令 npm run build&#xff0c; 构建的结果在disc目录&#xff1a; 2. springboot集成 2.1 拷贝vue3构建结果到springboot resources/static目录 2.2 springboot pom依赖 添加thymeleaf依赖 <dependency><groupId>org.springframework.boot</…

Rust错误处理和Result枚举类异常错误传递

Rust 有一套独特的处理异常情况的机制&#xff0c;它并不像其它语言中的 try 机制那样简单。 首先&#xff0c;程序中一般会出现两种错误&#xff1a;可恢复错误和不可恢复错误。 可恢复错误的典型案例是文件访问错误&#xff0c;如果访问一个文件失败&#xff0c;有可能是因…

机器学习模型—线性回归

文章目录 机器学习模型—线性回归线性回归模型的假设线性回归简单线性回归多元线性回归多元线性回归实现多项式回归多项式回归的实现线性回归二阶函数回归三阶函数回归总结机器学习模型—线性回归 线性回归是一种统计方法,用于对因变量与给定的一组自变量之间的关系进行建模。…

乔琼:高性能会议传声器的产品优化设计| 演讲嘉宾公布

一、智能家居与会议系统 智能家居与会议系统分论坛将于3月28日同期举办&#xff01; 智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代企业、政府机构和学术界是不可或缺的。在这里&#x…

arm系统构建的基础知识

目录 一、环境变量 二、归档和压缩 (一) 常用命令 (二) 常用参数 三、磁盘分区和挂载 四、网络管理 一、环境变量 显示环境变量 —— echo设置临时环境变量 —— exportecho $PATH —— 显示当前PATH环境变量 在当前目录下&#xff0c;编写一个hello.c 编译并运行。 图…

有哪些搭建代理服务器的好方法?--代理IP小课堂

在互联网技术日益成熟的今天&#xff0c;代理服务器在提升网络安全性、提高访问速度以及数据抓取等方面发挥着越来越重要的作用。无论是大型企业还是个人用户&#xff0c;都可能会考虑搭建自己的代理服务器来满足特定的网络需求。今天我们就来说一说&#xff0c;要如何搭建代理…

千帆AppBuilder使用指南-组件中心

应用中心 百度智能云千帆AppBuilder&#xff08;以下简称为AppBuilder&#xff09;应用中心&#xff0c;提供了大量可以立即体验的应用示例&#xff0c;开发者可以在这里搜索感兴趣的应用进行使用。 官方应用&#xff1a;AppBuilder官方提供的应用&#xff0c;可以立即体验应用…

【nowcoder】NC248 左叶子之和

NC248 左叶子之和 计算给定二叉树的左叶子之和。 树上叶子节点指没有后继节点的节点&#xff0c;左叶子指连向父节点的左侧的叶子节点。 int sumOfLeftLeaves(struct TreeNode* root ) {if (root ! NULL) {int sum 0;if (root->left ! NULL && root->left->…

人民币波幅大幅收窄,未来方向将如何发展?

过去一周&#xff0c;在岸与离岸人民币的汇率波动变得极为有限&#xff0c;单周振幅收窄至约100点&#xff0c;较前一周进一步缩窄。上周&#xff0c;在岸人民币对美元的汇率最终定格在7.1960&#xff0c;周涨幅仅为0.03%。 多位外资银行的交易员和策略师在接受记者采访时指出…

【CSP试题回顾】201409-3-字符串匹配

CSP-201409-3-字符串匹配 关键点&#xff1a;<string>库函数的使用 length() 或 size(): 返回字符串的长度。 empty(): 检查字符串是否为空。 append() 或 : 向字符串的末尾添加字符或另一个字符串。 insert()在字符串的指定位置插入另一个字符串或字符。 std::str…

34、keyof类型操作符

文章目录 js中的Object.keys()ts中的keyof实践中有何用应用范围 ts中有很多的工具类型&#xff1a;Partial部分、Required必填项、Pick选择、Record 记录&#xff1b;keyof在其中有大量的运用 js中的Object.keys() const keys Object.keys({id: 12,name:z}) // [id, name]ts中…

数组----柔性数组

C99标准中&#xff0c;定义了一个关于数组的动态数组的概念&#xff0c;该数组可以根据实际需求来改变数组的长度&#xff0c;以实现柔性变化&#xff0c;这种数组也被称为柔性数组。 一.柔性数组的定义 在结构体中&#xff0c;最后一个元素为可变长度的数组&#xff0c;这个…

redis未设置密码被植入挖矿脚本

最近一台测试linux响应速度贼慢&#xff0c;检查发现cpu消耗高达100%&#xff01;查看进程杀死后过段时间又重启了&#xff0c;一时间也摸不到头绪。无意间发现启动redis的时候cpu瞬间拉到了100%&#xff0c;主要就是zzh和newinit.sh两个脚本。百度了一下说是被植入了挖矿脚本&…

玩转安卓之配置gradle-8.2.1

概述&#xff1a;看了一下&#xff0c;由于gradle是国外的&#xff0c;所以下载速度很慢&#xff0c;这个老师又是很菜的类型&#xff0c;同学又不会&#xff0c;于是曹某就写这一篇文章&#xff0c;教大家学会简单的为安卓配置gradle-8.2.1。 第一步&#xff1a;下载gradle-8…

990-41产品经理:Essential Skills for Written Communication 书面沟通的基本技能

What is written communication? 什么是书面沟通&#xff1f; In the age of information, there is simply too much to remember. A simple solution is to write it all down. Written communication definition Written communication is making use of the written word…

电时代来临:2024北京新能源锂电池技术展盛夏8月!

2024中国&#xff08;北京&#xff09;国际新能源电池技术及设备展览会 时间&#xff1a;2024年8月1-3日 地点&#xff1a;中国国际展览中心&#xff08;顺义馆&#xff09; 展会概况 受益于政策的支持&#xff0c;我国新能源汽车市场规模逐步扩大、渗透率逐步提高&#xf…

前段结课总结

一.HTML基础 1.标记的类型&#xff1a;单个标记和成对标记&#xff0c;单个标记例如<br />用来设置换行操作<hr />用来设置分割线的属性<link />用来进行连接外部的文件&#xff0c;例如HTML文档的CSS样式设置可以放在新建的CSS文件类型里面&#xff0c;通过…