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

目录

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

简明原理

linuxdeployqt 成功打包与 qt.conf文件密切相关:通过配置Qt 的 qt.conf,可以 Overriding Paths,从而人为地改变了可执行程序对库、以及相关依赖的路径搜索顺序(操作系统本身的设计就支持、或默认了需要搜索的几个不同关键路径的。但不可能设计成搜索操作系统本身自有的、所有的路径,这太耗时间了,也没有必要吧?)。

------------------------------------------------------------------------

运行测试

有的 .AppImage 型的 app,并不能直接运行。需要如下处理:

1. 解包: xx.AppImage 在当前目录下。

直接运行时,NG,出现错误提示:

$ ./koreader-appimage-x86_64-linux-gnu-v2023.10.AppImage
dlopen(): error loading libfuse.so.2

AppImages require FUSE to run.
You might still be able to extract the contents of this AppImage
if you run it with the --appimage-extract option.
See https://github.com/AppImage/AppImageKit/wiki/FUSE
for more information

解决:解包

$ ./koreader-appimage-x86_64-linux-gnu-v2023.10.AppImage --appimage-extract

2. 进入解包后的目录:squashfs-root,然后,运行:

$ ./AppRun

3. 如果需要,则创建一个 desktop 快捷方式来运行,即可。

不过,如果不是常用的 app,那么,就没必要这么麻烦了吧?

------------------------------------------------------------------------

简明用法

win下的 Qt打包工具是 Qt Creator自带的官方工具。
linux下 Qt5没有官方工具,需要使用第三方的。比如:CQtDeployer, AppImage。甚至是自己编写的打包 shell 文件。

AppImage的特点:

1.  linuxdeployqt 运行环境设置: 在终端带路径可以直接运行 AppImage 文件。

如果想不带路径运行,可以直接 cd 到 linuxdeployqt 目录下运行,或者使用绝对路径,或者增加软链接,或者直接 mv linuxdeployqt /usr/local/bin,或者。。。。。。

linuxdeployqt-continuous-x86_64.AppImage

特别注意:这个两个不同的工具

linuxdeployqt-continuous-x86_64.AppImage   <PK>   appimagetool-x86_64.AppImage

一不留神,就会用错了。

区别:

>> linuxdeployqt-continuous-x86_64.AppImage 的用途:制作"单一文件"的、可直接运行的 “绿色软件” 。
      将存在在操作系统中的、目标App 的依赖库,全部拷贝到目标App 的目录下,并通过 qt.conf 配置文件,改变了 目标App 在运行时对依赖库的搜索路径(此时为 “绿色软件” 的制作方法和过程,目标App的运行,将首先搜索本App目录下的库,而不是操作系统中的库)。

   

注:还有一个 “linuxdeploy”,针对 linux app进行打包的工具;linuxdeployqt 是基于“linuxdeploy”之上的专门对 Qt打包的优化和改动。

   

>> appimagetool-x86_64.AppImage 的用途:制作单一文件的、可直接运行的 “绿色软件” 。
      将由 linuxdeployqt-continuous-x86_64.AppImage 制作好的 “绿色软件”,对其进行整个目录打包,从而形成一个单一的可执行文件。

  

>> 非单一、或单一,它们各有自己的优缺点,不是“单一”就更好。
      假如在打包时的依赖库过时、缺失,换了一台新的电脑使用环境等原因,导出运行错误等问题,则需要:将单一文件还要进行解包,以便对库进行升级或补全。在修补之后,可直接(按解包的绿色软件的方式)使用即可,或者重新打包再使用。

      当在软件设计时,文件结构不合理时,打包成单一文件或造成 App的功能失效。比如:App需要修改某个C文件的内容,而这个文件却被打包进了 单一文件的App内部,造成某个 txt, ini 等文件的内容无法更改。

2.  qmake 运行环境设置:需要设置 Qt 运行环境。

linuxdeployqt 的运行,需要调用 qmake,这样才能获得 App到底需要使用到在操作系统中的哪一些依赖库等等。

以下路径,/opt/Qt5.13.0/5.13.0/ 这部分是相同的。

## 修改文件 ~/.bashrc

                 

#add qt env
export PATH=/opt/Qt5.13.0/5.13.0/gcc_64/bin:$PATH
export LIB_PATH=/同上/lib:$LIB_PATH
export PLUGIN_PATH=/同上/plugins:$PLUGIN_PATH
export QML2_PATH=/同上/qml:$QML2_PATH

vim ~/.bashrc
source ~/.bashrc
qmake -v

3. 默认的运行简单

注:需要运行权限。

//进入用户的Qt App目录,该目录下只有:userQtApp 应用软件。然后,运行:

         

/root_to_path/linuxdeployqt-continuous-x86_64.AppImage   userQtApp   -appimage

4. 自带了一个默认的快捷桌面文件 default.desktop。

这个 default.desktop文件的内容,实在是太少了。只包含了确保可以运行的最少参数。

问题:

1. 运行 linuxdeployqt-continuous-x86_64.AppImage,会提示 desktop文件的 两个 key有错误。

解决:需要后期手动 设置 desktop的 key。所以出现这个错误,不用担心。

软件的作者,是无法替用户做主的。比如:Name=Application;Type=Application,如果用户需要使用自己的 app名称呢?

2. 运行 appimagetool-x86_64.AppImage 时,也会出现分类错误,设置成 Categories=GNOME,或其他合乎要求的键值,就可以了。否则,这个 app不会继续运行。

原因:作者在其官方仓库,提供了用户上传 自己的 app的功能(当然,不想上传就不上传),上面有分类(Categories),方便用户上传的 app自动进行分类之用;不提前设置好合格的 Categories,这个app就运行不了。

注:

运行权限:将这个文件拷贝到 桌面文件夹(~/Desktop/) 之后,需要为其增加可运行权限。

5. 新版特点:linuxdeployqt-continuous-x86_64.AppImage   15.6 MB  2023 Apr 24

支持 debian 11。

6. 问题

6.1 只有 linux版本。

6.2 CQtDeployer:linux /windows 双跨平台

注:Qt 在win下打包,官方已经提供了打包工具,因此,没有必要了。

default.desktop : linuxdeployqt 工具默认生成的

[Desktop Entry]
Type=Application
Name=Application
Exec=AppRun %F
Icon=default
Comment=Edit this default file
Terminal=true

linuxdeployqt 生成的文件夹

使用linuxdeployqt在linux下进行Qt打包发布 (超详细) (*****)_第1张图片

 说明:

1. AppRun::链接到用户 abcApp

2. .desktop:Exec=AppRun %F :这样的好处是:所用的用户都可以只使用一个不再需要修改的.desktop模板文件。

下载资源:

https://download.csdn.net/download/ken2232/87934515

-----------------------------

linuxdeployqt 成功打包与 qt.conf文件密切相关

在 userApp目录下,自动产生的 qt.conf文件

# Generated by linuxdeployqt
# https://github.com/probonopd/linuxdeployqt/
[Paths]
Prefix = ./
Plugins = plugins
Imports = qml
Qml2Imports = qml

通过配置Qt 的 qt.conf,可以 Overriding Paths,从而人为地改变路径的搜索顺序。

参考:配置Qt 运行的设定:qt.conf 和 qtconfig (***)

https://blog.csdn.net/ken2232/article/details/131311986

配置Qt 运行的设定:qt.conf 和 qtconfig
可以 : Overriding Paths

Using qt.conf

https://runebook.dev/zh/docs/qt/qt-conf
Qt程序启动时会用QLibraryInfo类载入qt.conf文件, 按下面的路径顺序搜索 :

资源系统, :/qt/etc/qt.conf

Mac系统下会在资源目录, 例如:assistant.app/Contents/Resources/qt.conf

执行档所在目录,如:QCoreApplication::applicationDirPath()+QDir::seperator()+”qt.conf”

===========================================

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

首先,来说下,本教程实现的功能:

    在linux下对开发的Qt应用,进行拷贝依赖文件so等,并打成deb安装包;
    实现可安装、卸载,安装完毕自动在开始菜单下和桌面添加快捷方式;
    卸载后自动删除快捷方式,以及删除应用生成的log文件。

测试环境:ubuntu 16.04

一、使用linuxdeployqt拷贝依赖文件

win系统下有个自动拷贝依赖文件的工具windeployqt,而linux系统下也有个类似的工具,叫linuxdeployqt,原理一个意思。

该工具的帮助文档:https://github.com/probonopd/linuxdeployqt/blob/master/README.md

有兴趣,可以自己看看。

1. 下载linuxdeployqt

linuxdeployqt-x86_64.AppImage,下载地址:

​ ​https://github.com/probonopd/linuxdeployqt/releases​​

使用linuxdeployqt在linux下进行Qt打包发布(超详细)_加载

2. 安装linuxdeployqt

为了我们后面使用时,方便一点,我们把这长长的名字改短点吧:

mv linuxdeployqt-6-x86_64.AppImage linuxdeployqt

然后修改为可执行权限

chmod 777 linuxdeployqt

再把这个可执行文件扔进/usr/local/bin目录,这样,我们就可以在其他目录访问了

mv linuxdeployqt /usr/local/bin

测试是否安装成功

linuxdeployqt --version

输出版本信息,表示安装成功。

3. Qt库路径设置到环境变量

工具会根据生成的可执行文件,自动搜索依赖,故我们需要确保Qt库的相关路径设置到环境变量中,这样工具在搜索时才能找到,并拷贝它们。

另外拷贝文件,对环境变量的使用,不想要重启系统那么麻烦,所以我们修改.bashrc文件,仅对当前用户永久有效。

vim ~/.bashrc

在.bashrc文件末尾,追加内容如下:

#add qt env
export PATH=/opt/Qt5.13.0/5.13.0/gcc_64/bin:$PATH
export LIB_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/qml:$QML2_PATH

其中,/opt/Qt5.13.0/5.13.0/gcc_64是本次测试环境Qt安装目录,大家根据自己的情况替换。

然后,使用source命令让文件立即生效。

source ~/.bashrc

然后,对环境变量测试下,是否设置正确。如下:

qmake -v

 看到qmake的版本号,则表示设置成功。

提示:

    根据linuxdeployqt在线帮助文档介绍,其实上述最重要的环境变量就是PATH这条,其他的并没有说,或许其他不要也没啥问题。

4. 拷贝依赖文件

拷贝前,确认生成的是Release版本的程序,这个是常识。

我们在根目录下建立TestSetup目录,用于放置打包相关的文件;

并在TestSetup下继续建个Test目录,用来装Test应用及拷贝文件。

mkdir TestSetup
cd TestSetup
mkdir Test

把我们的应用Test拷贝到Test目录下

linuxdeployqt Test -appimage

终端报错,如下:
使用linuxdeployqt在linux下进行Qt打包发布 (超详细) (*****)_第2张图片
不用管它,是关于桌面文件的,后面我们直接编辑它。

一会后,/TestSetup/Test目录下,已经把依赖全部拷贝好了。
使用linuxdeployqt在linux下进行Qt打包发布 (超详细) (*****)_第3张图片
我们可以看到创建了lib等目录。

需要说明的是,

在执行“linuxdeployqt Test -appimage”命令时,其实除了拷贝依赖文件外,还对目标文件Test进行了修改,在Test中插入一些库路径信息

经过本人对前后2个文件内容的对比测试,至少是添加了lib目录的,其他没试过。

所以,你需要把程序依赖的so文件放入lib目录下,无论是显式、隐式加载的so,都是可以搜索到的。

若你的应用中还有其他,如配置文件等资源,那么手动拷贝到你自己代码指定的目录下。

实测结果:

1. 用户自己的 app,并没有被改变。linuxdeployqt 版本:15.6 MB  2023 Apr 24

也许??????

2. 应该是通过与 用户app在一起的 qt.conf来达到改变应用程序的搜素路径这种作用的 ?

重要提示:

    因为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,就都可以找到了。

5. 配置共享库搜索路径(可选)

如果你的应用中,调用了其他的库,又想要放在某个指定目录下,那么可以在应用同目录下,添加qt.conf文件,指定库搜索路径。这块知识,就自行百度吧,反正最终目的,能正常启动应用就行。
6. 测试应用能否正常运行

此时,一个完整的运行环境已经具备了,我们测试一下。

重新开一个终端,在该终端的环境变量中去掉Qt库相关的路径,修改后的环境变量只对该终端生效,然后我们执行应用,看能否运行。

操作过程:先用export查看有哪些环境变量设置了Qt路径。

export

使用linuxdeployqt在linux下进行Qt打包发布 (超详细) (*****)_第4张图片

如果本教程之前没有配置过qt环境变量,那么结果应该和.bashrc文件我们追加的内容一致的。

然后把这些环境变量中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=

测试启动应用

./Test

此时如果不出意外,应该可以正常启动。

如果有意外,那就根据实际情况,先把问题解决,再继续。

二、打成deb包

1. deb包安装路径原理简述

下面举个例子进行说明,我们先来看打包目录与安装后目录结构对比。

打包目录,DEBIAN下面为deb包控制文件,应用与依赖文件位于source/opt/Test/,如下:

source
├── DEBIAN
│   └── control
│   └── postinst
│   └── postrm
├── opt
    └── Test
        ├── Test
        └── xxx

若按照此打包目录生成deb,安装后,其目录如下:

/
├── opt
    └── Test
        ├── Test
        └── xxx

小结:

    DEBIAN目录下主要存放一些控制文件和脚本,具体后面使用到时,再细说。

    DEBIAN目录固定放置于打包目录顶层。

    deb包安装时,默认将内部文件,释放至根目录下(/),故我们需要在打包时,将安装目录层次创建好,以达到想要的安装路径效果。

2. 规划安装路径

我们希望将Test应用安装到/opt/Test/下,下面开始创建目录层次。

在/TestSetup/下创建output目录,用于存放生成的deb包;

创建source目录,用于存放打包文件,如下:
使用linuxdeployqt在linux下进行Qt打包发布(超详细)_qt_07
在source目录下,创建DEBIAN目录、创建安装路径层次opt目录以及opt/Test目录,如下:
使用linuxdeployqt在linux下进行Qt打包发布(超详细)_运维_08
然后将前面我们拷贝的依赖文件,全部移动到/TestSetup/source/opt/Test/目录下,如下:
使用linuxdeployqt在linux下进行Qt打包发布(超详细)_qt_09

3. 配置*.desktop桌面快捷方式文件

还记得前面,拷贝依赖文件时报错吗,就是这个桌面文件。

直接把它扔到桌面文件夹(~/Desktop/),它就可以变成一个带图标的快捷方式,类似win。

我们把位于

/TestSetup/source/opt/Test/default.desktop 改为Test.desktop;

它有如下内容,需要编辑:

[Desktop Entry]
Type=Application
Name=My Test                    #应用的名字(快捷方式显示的文字)
Exec=/opt/Test/Test             #应用的执行路径(绝对路径)
Icon=/opt/Test/Test.png         #应用的图标(绝对路径)
Comment=This is my test         #说明信息
Terminal=true                   #是否允许在终端启动

我们按照上述内容进行编辑,其中图标,自己随便去下载一个.png放到/TestSetup/source/opt/Test/Test.png即可。

注意:

    Test.desktop文件需要有执行权限,该文件才能变成图标,否则只是显示一个普通文件

    Test.desktop中的路径需要填写deb包的安装路径,非打包路径。

    Terminal=true时,启动程序时,会附带启动终端界面,即会出现2个界面。

    Terminal=false时,启动程序时,没有终端界面,仅显示程序这一个界面。

4. 创建deb包之control文件

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

我们在DEBIAN目录下创建名为control的文件,内容如下:

Package: mytest
Version: 0.1.0
Section: utils
Priority: optional
Architecture: amd64
Depends:
Installed-Size: 512
Maintainer: [email protected]
Description: my test package

含义:

    Package:包名。记住,后面卸载时候需要包名。

    Version:应用版本。

    Architecture:架构,我这里是amd64。

    Maintainer:维护人员联系方式,看着办。

    Description:软件包描述。

    其他的,这里没用到,就不写了,自己百度吧。

5. 创建deb包之postinst文件

负责安装完成时的配置工作,软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行。

我们在DEBIAN目录下创建名为postinst的文件,内容如下:

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

主要将Test.desktop拷贝至2个目录,Desktop目录下,自动生成桌面快捷方式。

applications目录下,生成开始菜单中,other菜单下子项。

最终效果,查看文章末尾处效果图。

6. 创建deb包之postrm文件

软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行。

我们在DEBIAN目录下创建名为postrm的文件,内容如下:

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

主要工作就是删除postinst创建的2个文件。

7. 使用dpkg命令构建deb包

对source目录下所有文件打包,在output目录下生成deb包。

cd /TestSetup/source
dpkg -b . /TestSetup/output/test_amd64_0.1.0.deb

打包结果:
使用linuxdeployqt在linux下进行Qt打包发布(超详细)_linux_11

三、deb包的安装与卸载

1. 安装

安装deb包命令如下:

cd /TestSetup/output
sudo dpkg -i test_amd64_0.1.0.deb

 安装完成,桌面效果:
使用linuxdeployqt在linux下进行Qt打包发布(超详细)_linux_12
开始菜单效果:
使用linuxdeployqt在linux下进行Qt打包发布(超详细)_desktop_13
安装路径效果:
使用linuxdeployqt在linux下进行Qt打包发布(超详细)_linux_14

2. 卸载

卸载时,使用control文件中的包名。

sudo apt-get remove mytest

卸载之后,安装路径下文件全部删除,自动删除桌面快捷方式和菜单项。

若应用生成一些log文件,因不在打包文件中,故不会自动删除,

则需要在postrm文件中添加删除命令。

参考链接:

​ ​《Ubuntu下的deb打包、安装与卸载》​​

​ ​《Ubuntu中deb包详解及打包教程》​​

​ ​《Linux下通过.desktop文件创建桌面程序图标(快捷方式)及文件编写》​​
-----------------------------------
使用linuxdeployqt在linux下进行Qt打包发布(超详细)
https://blog.51cto.com/xiaohaiwa/5383414

参考:

利用 appimagetool 工具对开发好的项目进行打包 (***)
https://blog.csdn.net/ken2232/article/details/131313613

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

https://blog.csdn.net/ken2232/article/details/131305081

https://blog.csdn.net/zyhse/article/details/106381937

Linux下的QT程序的打包、运行、和关闭程序教程整理

https://blog.csdn.net/ken2232/article/details/129380997

: https://blog.51cto.com/xiaohaiwa/5383414

你可能感兴趣的:(Qt,linux,linux,qt)