当前位置: 首页 > news >正文

Linux平台程序打包

        Linux平台下开发的应用程序,如何打包及安装,本文将给出一种常见的Linux平台打包方法。

        本章简要叙述如何在 Linux 下使用 linuxdeployqt和appimagetool两个命令工具将Qt应用程序打包成一个后缀为.AppImage的可执行程序,之后再使用dpkg-deb命令将可执行程序制作成deb安装包。

一、安装打包工具

1.1 安装linuxdeployqt

        linuxdeployqt主要用于收集Qt应用程序的资源(如库、图形、插件等),确保应用程序在运行时能够找到所有必要的库和资源。它不直接打包应用程序,而是生成一个包含所有依赖信息的json文件,这个文件随后可以被其他工具(如appimagetool)用来创建可执行文件。

        在使用linuxdeployqt之前我们需要将该工具安装到当前系统环境下。

  1. 直接在github上下载已经编译好的linuxdeployqt-continuous-x86_64.AppImage应用程序文件;
  2. 运行chmod +x linuxdeployqt-continuous-x86_64.AppImage命令赋予应用程序可执行权限;
  3. 运行mv linuxdeployqt-continuous-x86_64.AppImage linuxdeployqt命令更改程序文件名称,方便后续调用;
  4. 运行sudo cp linuxdeployqt /usr/local/bin/ 命令将可执行程序文件拷贝到用户本地可执行文件目录下,之后linuxdeployqt命令可以直接调用而不需切换到可执行文件所在目录下。
  5. 运行linuxdelpoyqt –version命令查看文件是否安装成功,若输出版本信息表示安装成功。

1.2 安装appimagetool

        appimagetool是一个将应用程序及其所有依赖项打包成一个单一文件的工具。它支持多种格式,包括AppImage,这使得应用程序可以在没有安装Qt环境的Linux系统上直接运行。

        如果没有安装appimagetool,直接使用linuxdeployqt打包,将会出现如下错误:

sh: 1: appimagetool: not found

        接下来将appimagetool安装到当前系统环境下:

  1. 直接在github上下载已经编译好的appimagetool-x86_64.AppImage应用程序;
  2. 运行chmod +x appimagetool-x86_64.AppImage命令赋予应用程序可执行权限;
  3. 运行mv appimagetool-x86_64.AppImage appimagetool命令更改程序文件名称,方便后续调用;
  4. 运行sudo cp appimagetool /usr/local/bin/ 命令将可执行程序文件拷贝到用户本地可执行文件目录下。
  5. 运行appimagetool –version命令查看文件是否安装成功,若输出版本信息表示安装成功。

1.3 安装patchelf

        为了确保打包的完整性和可执行性,我们还需要安装patchelfpatchelf用于修改ELF可执行文件和共享库,使其能够找到动态链接库,它常用于解决动态链接库路径问题。

        运行命令sudo apt install patchelf安装patchelf

二、配置环境变量

        为了使linuxdeployqt能够顺利找到程序所依赖的所有资源文件,我们需要在打包之前配置好环境变量。

        在终端输入命令vi ~/.bashrc 修改 .bashrc 文件,在文件末尾追加以下内容:

#add QT ENV
export PATH=/home/Admin/Qt5.14.0/5.14.0/gcc_64/bin:$PATH
export LD_LIBRARY_PATH=/home/Admin/Qt5.14.0/5.14.0/gcc_64/lib:$LD_LIBRARY_PATH
export QT_PLUGIN_PATH=/home/Admin /Qt5.14.0/5.14.0/gcc_64/plugins:$QT_PLUGIN_PATH
export LD_LIBRARY_PATH=/home/Admin/IP8000/Build_unix/Release:$LD_LIBRARY_PATH

        以上添加的环境变量中,第一行是Qt可执行命令文件路径,第二行是Qt基础库路径,第三行是Qt插件库路径,第四行是IP8000产物路径,该路径下有程序所依赖的第三方库。

        然后输入命令source ~/.bashrc,使shell文件~/.bashrc立即生效,而不必注销并重新登录。

三、生成AppImage可执行程序

        打包工具安装完成且release版本的可执行文件生成之后就可以开始生成后缀为.AppImage的可执行程序了。

  1. 我们需要创建一个文件夹,名称使用可执行文件的名称,然后将release目录下的<可执行文件>及其他所有资源文件复制到此文件夹下;
  2. 创建.desktop文件,命名为<可执行文件名称>,添加如下格式的内容(具体内容可以自行上网搜索):
    [Desktop Entry]
    Type=Application
    Name=ClientName
    Comment=This is a desktop file test
    Exec=/usr/share/<Program Directory>/runApp
    Icon=IBC_min
    Categories=Application;
    Terminal=fasle
  3. 创建一个png文件并命名为IBC_min,作为客户端的图标log;
  4. 编写一个运行脚本runApp.sh,添加如下内容:
    #!/bin/sh
    # 获取脚本的实际路径
    shellPath="$(readlink -f "${0}")"
    # 脚本实际路径,与可执行程序的路径,是同一个目录
    shellDir="$(dirname "${shellPath}")"
    # 根据实际设置
    appName="IvsPatrolClient"
    appDir="${shellDir}"
    # 引入库路径
    export LD_LIBRARY_PATH=${appDir}:$LD_LIBRARY_PATH
    #运行应用
    exec "${appDir}/${appName}"
  5. 运行命令chmod +x runApp.sh给运行脚本添加执行权限
  6. 打开终端,运行命令linuxdeployqt <ExcuteFileName> -appimage,最终可以在创建的目录下找到一个后缀为.AppImage的应用组合包。

四、生成deb包

        实事实上,双击AppImage 并没有真正安装软件。它是一个压缩映像,是一种通用的软件包格式,包含运行所需软件所需的所有依赖项和库。你执行 AppImage 文件运行软件。没有任何的提取和安装操作。删除 AppImage 文件,软件就被删除了。可以将其与 Windows 中的 .exe 文件进行比较,这些文件允许您在不实际执行安装过程的情况下运行软件。但这对于一般的工具型软件来说是不够的,一般软件程序需要有一个提取和安装的过程,因为我们在使用客户端软件的过程中可能需要通过修改外部配置文件来影响客户端的某些功能,我们可以将可执行程序与所有依赖资源一起打包成一个deb安装包来实现上述目的。

 4.1 打包目录结构

        通常可以在程序目录下面新建一个Bin文件夹,此文件夹下面包含了打包脚本等文件。这里详细描述一下Bin文件夹的目录结构。

        按图(4-1-1)结构分别创建目录和文件:

(4-1-1)

4.2 主要脚本文件内容及作用

  1. control文件内容如下所示,该文件用来记录PCAPP安装包的安装信息。
    Package: <Package Name>
    Version: 1.0
    Architecture: amd64
    Maintainer: YourName <YourName@unknown>
    Installed-Size: 43
    Depends: libc6 (>= 2.0)
    Section: utils
    Priority: optional
    Homepage: http://www.abc.com
    Description: a test of package deb
  2. postinst文件内容如下所示,本文件在安装程序后自动调用。
    #!/bin/sh
    # postinst script for hello
    #
    # see: dh_installdeb(1)
    
    echo "============== configure hello by postint ============="
    chmod 777 /usr/share/<Program Directory>/<exec. file name>
    rm -rf /usr/bin/<exec. file name>
    ln -s /usr/share/<Program Directory>/<exec. file name> /usr/bin/<exec. file name>
    mv /usr/share/<Program Directory>/<exec. file name>.desktop /usr/share/applications
    mv /usr/share/<Program Directory>/IBC_min.png /usr/share/pixmaps/
    
    #更新桌面图标数据库
    update-desktop-database /usr/share/applications || true
    #获取当前的用户名
    username=`getent passwd \`who\` | head -n 1 | cut -d : -f 1`
    #判断桌面文件夹是否存在
    if [ -d "/home/${username}/Desktop" ]; then
    echo 'Desktop exist'
    #将你的桌面文件复制到桌面
    cp /usr/share/applications/<exec. file name>.desktop /home/${username}/Desktop
    else
    echo '桌面文件夹存在'
    #中文系统自动复制到中文桌面
    cp /usr/share/applications/<exec. file name>.desktop /home/${username}/桌面
    fi
    echo "Ok!"
    
    
  3. postrm文件内容如下所示,脚本文件在卸载程序后自动调用。
    #!/bin/sh
    # postinst script for hello
    #
    # see: dh_installdeb(1)
    
    echo "============== executing postrm1234567 ============="
    rm -rf /usr/bin/<exec. file name>
    rm -rf /usr/share/applications/<exec. file name>.desktop
    rm -rf /usr/share/pixmaps/IBC_min.png
    #更新桌面图标数据库
    update-desktop-database /usr/share/applications || true
    #获取当前的用户名
    username=`getent passwd \`who\` | head -n 1 | cut -d : -f 1`
    #判断桌面文件夹是否存在
    if [ -d "/home/${username}/Desktop" ]; then
    echo 'Desktop exist'
    #将你的桌面文件复制到桌面
    rm -rf /home/${username}/Desktop/<exec. file name>.desktop
    else
    echo '桌面文件夹存在'
    #中文系统自动复制到中文桌面
    rm -rf /home/${username}/桌面/<exec. file name>.desktop
    fi
    echo "removing  is ok!"
    

4.3 运行打包命令获取deb包

        运行dpkg-deb命令获取deb安装包,这里需要注意命令运行目录,我们在Bin文件夹上级目录打开终端,输入以下命令打包:

dpkg-deb –b Bin <包名称>.deb

        包的名称一般使用客户端名称即可,也可包含版本号等特殊信息。

五、程序安装及验证

  • 安装deb包:(1)双击deb文件安装;(2)使用如下命令安装

sudo dpkg –i < package_name>.deb

  • 查看是否安装成功

dpkg –i | grep < package_name>

显示两个“ii”字幕,标识安装成功,接下来就可以使用客户端软件程序了。

  • 程序测试,终端输入客户端名称,看程序是否可以正常启动
  • 如果需要卸载创建包,可使用如下命令

sudo apt-get remove < package_name>

相关文章:

  • 鸿蒙北向源码开发: xts用例单部件编译并执行测试用例
  • 向量库特点和使用场景
  • 七、服务器远程桌面报错
  • 鸿蒙相机开发实战:从设备适配到性能调优 —— 我的 ArkTS 录像功能落地手记(API 15)
  • 电池电量检测方法介绍,开路电压法、库仑积分法、内阻法
  • Maven环境搭建与配置
  • 系统架构设计知识体系总结
  • 关于墙面涂鸦的视觉检测与喷涂修复装置研究(大纲)
  • 通过SSH隧道与跳板机实现本地端口映射访问服务器文件
  • 数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码
  • MTKAndroid12 解决SystemUI下拉框中,长按WIFI图标会导致崩溃问题
  • 深入了解Spring事务及其使用场景
  • go:前后端分离
  • (UI自动化测试)第二篇:元素定位的方法_name定位
  • 【学习】CMMM/DCMM等智能制造产业常见资质学习
  • hive:处理JSON格式(get_json_object()函数),连续登录题型,快速生成表(explode,stack),迭代计算
  • 使用flask_restful快速构建接口
  • AI生成移动端贪吃蛇游戏页面,手机浏览器打开即可玩
  • .net core集成MQTT服务端
  • Pytorch中的torch.utils.data.Dataset 类
  • 历史一刻,两个航天员乘组拍摄全家福
  • 临汾攻坚PM2.5:一座曾经“爆表”城市的空气治理探索
  • 云南洱源县4.8级地震:房屋受损442户,无人员伤亡报告
  • 北京市交通委通报顺平路潮白河大桥事故直接原因
  • 书信里的宋人|忠奸难辨的夏竦
  • “仅退款”将成过去时!多个电商平台集体修改售后规则,商家获得更多自主权