Linux 环境打包 QT 程序

2024-06-01 1110阅读

目录

前言

一、安装Qt库和编译器

二、编译生成可执行文件

三、准备脚本

四、添加程序依赖库

五、添加 Qt 相关依赖库

六、发布 deb 安装包

参考文章


前言

Qt是一个跨平台的GUI框架,可以在多种操作系统上运行,包括Linux、Windows和macOS。因此,将Qt程序打包为Linux可执行文件可以确保在Linux系统上正确运行,而不受其他平台的影响。

在Linux系统中,软件包管理是一个重要的概念。通过打包Qt程序,可以将程序及其依赖项打包到一个文件中,方便在其他Linux系统上部署和运行。这样可以避免用户在安装程序时遇到缺少依赖项的问题,简化了部署流程。

打包Qt程序使其成为一个独立的可执行文件,方便发布和分发。用户可以通过简单地执行该文件来运行程序,而无需进行额外的设置或配置。

开发环境采用:Win 10 + WSL2 + Ubuntu 20.04 + GNOME桌面版

环境配置教程可以看我的上篇文章:

Windows配置Linux环境(Win 10 + WSL2 + Ubuntu 20.04 + GNOME桌面版)


一、安装Qt库和编译器

在Linux命令行上编译Qt程序之前,您需要先安装Qt库和编译器。您可以通过在终端中运行以下命令来安装Qt库和编译器:

sudo apt-get update
sudo apt-get install build-essential qt5-default qtcreator

如果项目需要网络通讯模块,需要下载依赖的库:

sudo apt-get install qtdeclarative5-dev qtpositioning5-dev qtwebengine5-dev libqt5webchannel5-dev qml-module-qtwebengine

需要串口通讯模块,下载依赖的库:

sudo apt-get install libqt5serialport5 libqt5serialport5-dev

二、编译生成可执行文件

准备好 qt 源码项目,qt 代码目录结构如下所示,一个简单的switch按钮项目。本教程采用命令行对 qt 源码编译生成可执行文件。也可以通过下载 qt creator 图形化界面进行 release 版本的发布。

Linux 环境打包 QT 程序

SwitchButton.pro 如下所示:

#-------------------------------------------------
#
# Project created by QtCreator 2019-06-20T17:49:03
#
#-------------------------------------------------
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = SwitchButton
TEMPLATE = app
SOURCES += main.cpp\
        FrameSwitchButtons.cpp \
    SwitchButton.cpp
HEADERS  += FrameSwitchButtons.h \
    SwitchButton.h
FORMS    += FrameSwitchButtons.ui

Linux终端命令行使用 qmake 生成一些 makefile 文件 和 debug 和 release 文件夹。大家使用时替换自己项目的 .pro项目文件

qmake SwitchButton.pro

Linux 环境打包 QT 程序

使用 make 进行编译,生成可执行文件

make

Linux 环境打包 QT 程序

运行可执行文件,显示 qt 可视化界面

./SwitchButton

效果如下。至此,编译生成可执行文件已完成。

Linux 环境打包 QT 程序

三、准备脚本

准备两个脚本,我放在源码目录 script 下,可以自己选择存放脚本的目录

Linux 环境打包 QT 程序

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

      该脚本名称必须和 qt 可执行文件名一致。

      #!/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 "$@"

      给这两个脚本加权限

      sudo chmod 777 ldd.sh
      sudo chmod 777 SwitchButton.sh

      四、添加程序依赖库

      在源码目录下,新建一个空的文件夹 package,用于存放程序及其动态库。也可以在其他位置新建文件夹。

      Linux 环境打包 QT 程序

      将编译的可执行文件复制到文件夹 package。

      cp ./SwitchButton ./package/

      将ldd.sh脚本复制到编译目录,该项目为源码根目录。

      cp ./script/ldd.sh ./

      Linux 环境打包 QT 程序

      执行 “./ldd.sh SwitchButton”,会在当前目录生成 lib 文件夹。其中存放着运行 SwitchButton 所依赖的库文件

      Linux 环境打包 QT 程序

      将 lib 文件夹中的所有文件复制到新建的文件夹 “package” 文件夹中。至此,就可以删除生成的lib文件夹和ldd.sh脚本了

      cp -r ./lib/* ./package/

      Linux 环境打包 QT 程序

      五、添加 Qt 相关依赖库

      通过 whereis qt5 找到 qt5 的安装目录。通常是 /usr/lib/x86_64-linux-gnu/qt5

      tanghao@DESKTOP-KL9JBME:/mnt/d/code/qt_pro/switchButton-master/package$ whereis qt5
      qt5: /usr/lib/x86_64-linux-gnu/qt5 /usr/lib/qt5 /usr/share/qt5

      将 ldd.sh 脚本复制到 Qt5 安装目录的 platforms 文件夹中;通常是 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms

      sudo cp ./script/ldd.sh /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/

      Linux 环境打包 QT 程序

      切换至 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms 目录下,执行 “sudo ./ldd.sh libqxcb.so”,生成 lib 文件夹。

      Linux 环境打包 QT 程序

      将生成的 lib 文件夹中的所有文件拷贝到 “package” 文件夹中。执行完该步骤后就可以删除生成的 lib 文件夹和 ldd.sh 脚本了;

      cp ./lib/* /mnt/d/code/qt_pro/switchButton-master/package/

      返回上一级,将 platforms 整个文件夹拷贝到 “package” 文件夹中;

      tanghao@DESKTOP-KL9JBME:/usr/lib/x86_64-linux-gnu/qt5/plugins$ cp -r ./platforms /mnt/d/code/qt_pro/switchButton-master/package

      Linux 环境打包 QT 程序

      该步骤为可选步骤。如果所编写的程序有操作数据库的模块,还需要将与 platforms 同级目录中的 sqldrivers 文件夹也拷贝到 “package” 文件夹中;

      Linux 环境打包 QT 程序

      最后将 SwitchButton.sh 脚本拷贝到 “package” 文件夹中即可。然后将整个 “package” 文件夹压缩就可以在其他机器上解压缩后运行。

      cp ../script/SwitchButton.sh ./

      Linux 环境打包 QT 程序

      在其他机器上,运行 SwitchButton.sh 脚本就可以运行打包好的软件了。

      六、发布 deb 安装包

      打包目录结构如下:

      .
      ├── DEBIAN
      │   ├── control
      │   ├── postinst
      │   └── postrm
      ├── etc
      │   └── ld.so.conf.d
      │       └── switchbutton-lib.conf
      └── usr
          ├── local
          │   └── SwitchButton
          │       ├── SwitchButton
          │       └── ...
          └── share
              └── applications
                  └── SwitchButton.desktop

      假如我们希望最终安装的文件在 /usr/local下,那么我们就在DEBIAN同级目录下创建 /usr/local 目录,然后将我们的程序目录放在这个文件下面即可。将前面我们生成的package目录下的依赖文件,全部移动到 usr/local/SwitchButton 目录下。

      在usr/share/applications目录下创建SwitchButton.desktop桌面快捷方式文件,编辑如下内容:

      [Desktop Entry]
      Type=Application
      Name=SwitchButton
      Exec=/usr/local/SwitchButton/SwitchButton
      Icon=/usr/local/SwitchButton/SwitchButton.png
      Comment=This is SwitchButton
      Terminal=true

      赋予权限:

      sudo chmod +x SwitchButton.desktop

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

      Package: switch-button
      Version: 0.1.0
      Section: utils
      Priority: optional
      Architecture: amd64
      Depends:
      Installed-Size: 4096
      Maintainer: 123@163.com
      Description: SwitchButton-deb
      ------- 以下为注释部分,执行时,请将从这一行开始的所有内容删除  --------
      package 表示安装包的名字 
      version 表示次安装包的版本
      architecture 当前系统的架构的信息
      maintainer 此安装包的维护者
      description 此安装包的描述

      创建deb包之postinst文件。负责安装完成时的配置工作,软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行。在DEBIAN目录下创建名为postinst的文件,内容如下。主要将SwitchButton.desktop拷贝至2个目录:Desktop目录下,自动生成桌面快捷方式;applications目录下,生成开始菜单中,other菜单下子项。

      #!/bin/bash
      cp /usr/share/applications/SwitchButton.desktop /home/${SUDO_USER}/Desktop/
      chmod +x /home/${SUDO_USER}/Desktop/SwitchButton.desktop
      sudo ldconfig -v

      创建deb包之postrm文件。软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行。在DEBIAN目录下创建名为postrm的文件,内容如下。主要工作就是删除postinst创建的文件。

      #!/bin/bash
      filename=/home/${SUDO_USER}/Desktop/SwitchButton.desktop
      if [ -f ${filename} ]
      then
          rm ${filename}
      fi
      exit 0

       赋予权限:

      sudo chmod 0775 postinst
      sudo chmod 0775 postrm

       在文件夹ld.so.conf.d下创建switchbutton-lib.conf,里面是安装后程序运行时需要的库路径。安装完后,会在/etc/ld.so.conf.d 文件夹下生成该文件。

      /usr/local/SwitchButton

      使用dpkg命令构建deb包。进入SwitchButtonSetup目录下,对目录下所有文件打包,生成deb包。

      dpkg -b . switch_button_amd64_0.1.0.deb

      deb包的安装。安装deb包命令如下:

      sudo dpkg -i switch_button_amd64_0.1.0.deb

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

      sudo apt-get remove switch-button
      

      参考文章

      通过命令行新建qt项目,并编译打包

      如何打包我们用 Qt 写的软件 - Linux 篇

      QT ubuntu打包deb包​​​​​​​

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]