问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Qt应用程序部署的那些坑,你避开了吗?

创作时间:
作者:
@小白创作中心

Qt应用程序部署的那些坑,你避开了吗?

引用
CSDN
12
来源
1.
https://blog.csdn.net/ReservedC/article/details/129996659
2.
https://blog.csdn.net/weixin_45805339/article/details/143201778
3.
https://blog.csdn.net/EvoGenius/article/details/137227392
4.
https://blog.csdn.net/asanpyx/article/details/136622374
5.
https://cloud.baidu.com/article/3290986
6.
https://blog.csdn.net/qq_35223555/article/details/144181011
7.
https://blog.csdn.net/black_procedure/article/details/136673543
8.
https://blog.csdn.net/mtyxb/article/details/138462954
9.
https://cloud.baidu.com/article/3289928
10.
https://my.oschina.net/emacs_8760247/blog/17198408
11.
https://my.oschina.net/emacs_8760250/blog/17198421
12.
https://www.cnblogs.com/minuhy/p/18462948

在开发完一个Qt应用程序后,如何将其顺利部署到目标机器上是一个不容忽视的重要环节。在这个过程中,开发者常常会遇到各种各样的问题,比如库文件的正确配置、插件路径的设置以及环境变量的管理。本文将详细介绍Qt应用程序在Windows和Linux平台上的部署技巧,帮助你避开常见的陷阱,顺利发布你的应用。

01

Windows平台部署

在Windows平台上,最常用的部署方式是使用Qt自带的Qt Installer Framework工具来创建自定义安装程序。以下是具体的步骤:

  1. 安装Qt Installer Framework

    首先,你需要从Qt Installer Framework官方网站下载并安装Qt Installer Framework。

  2. 创建安装包项目

    一个基本的安装包项目至少需要以下几个文件和目录结构:

    installer/
    ├── config/
    │   └── config.xml
    ├── packages/
    │   └── com.company.product/
    │       ├── data/
    │       │   └── <app files>
    │       ├── meta/
    │       │   ├── package.xml
    │       │   └── installscript.qs
    
  3. 配置config.xml

    config/目录下创建config.xml,该文件包含安装程序的整体配置。示例如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Installer>
        <Name>My Qt Application</Name>
        <Version>1.0.0</Version>
        <Title>My Qt Application Installer</Title>
        <Publisher>My Company</Publisher>
        <StartMenuDir>My Application</StartMenuDir>
        <TargetDir>@RootDir@/MyApplication</TargetDir>
    </Installer>
    
  4. 创建package.xml

    packages/com.company.product/meta/目录下创建package.xml文件,该文件定义了软件包的信息。示例如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <Package>
        <DisplayName>My Qt Application</DisplayName>
        <Description>This is my Qt application.</Description>
        <Version>1.0.0</Version>
        <ReleaseDate>2024-10-24</ReleaseDate>
        <Default>true</Default>
        <Script>installscript.qs</Script>
    </Package>
    
  5. 创建installscript.qs

    packages/com.company.product/meta/目录下创建installscript.qs文件,该文件包含安装脚本。基本的安装脚本如下:

    function Component() {}
    
    Component.prototype.createOperations = function()
    {
        component.createOperations();
        component.addOperation("CreateShortcut", "@TargetDir@/myapp.exe", "@StartMenuDir@/My Qt Application.lnk");
        component.addOperation("CreateShortcut", "@TargetDir@/myapp.exe", "@DesktopDir@/My Qt Application.lnk");
    }
    
  6. 添加应用文件

    将你的应用程序及其相关文件放在packages/com.company.product/data/目录下。确保包含所有必要的Qt库和插件。

  7. 构建安装包

    打开Qt Installer Framework的命令行工具,然后导航到你的安装包项目根目录,运行以下命令:

    binarycreator -c config/config.xml -p packages MyInstaller.exe
    

    这将生成一个名为MyInstaller.exe的安装程序。

  8. 测试安装包

    运行生成的MyInstaller.exe测试你的安装程序,确保其按预期工作并正确安装你的Qt应用程序。

02

Linux平台部署

在Linux平台上,部署Qt应用程序通常需要以下几个步骤:

  1. 安装Qt库和编译器

    在Linux命令行上编译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
    
  2. 编译生成可执行文件

    准备好Qt源码项目后,使用qmake生成Makefile文件,然后使用make进行编译。示例如下:

    qmake SwitchButton.pro
    make
    
  3. 准备脚本

    准备两个脚本,放在源码目录的script下:

    • 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
    
  4. 添加程序依赖库

    在源码目录下,新建一个空的文件夹package,用于存放程序及其动态库。将编译的可执行文件复制到文件夹package:

    cp ./SwitchButton ./package/
    

    将ldd.sh脚本复制到编译目录:

    cp ./script/ldd.sh ./
    

    执行./ldd.sh SwitchButton,会在当前目录生成lib文件夹。将lib文件夹中的所有文件复制到新建的文件夹“package”文件夹中:

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

常见问题及解决方案

  1. 环境变量配置问题

    在Linux系统中,需要正确配置环境变量。例如,将Qt的路径添加到PATH变量中:

    export PATH=/opt/Qt5.12.12/Tools/QtCreator/bin:$PATH
    
  2. xcb插件问题

    如果遇到QtCreator启动失败的问题,可能是由于xcb插件缺失。可以尝试安装以下依赖:

    sudo apt-get install '^libxcb.*-dev' libx11-xcb-dev libglu1-mesa-dev libxrender-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev
    
  3. gl库问题

    如果带界面的程序出现gl库相关问题,可以尝试安装:

    sudo apt-get install libgl1-mesa-dev
    
  4. 中文输入问题

    如果Qt程序无法输入中文,可以尝试安装fcitx插件:

    cd /opt/Qt5.12.12/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts
    sudo cp /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so ./
    sudo chmod +x libfcitxplatforminputcontextplugin.so
    
04

最佳实践

  1. 确保所有依赖库完整

    在部署前,务必确保所有必要的Qt库和插件都已包含在安装包中。可以使用ldd命令检查可执行文件的依赖关系:

    ldd your_application
    
  2. 使用静态编译

    如果条件允许,可以考虑使用静态编译来避免动态库版本冲突问题。但需要注意,静态编译可能会导致可执行文件体积较大。

  3. 测试不同环境

    在发布前,尽量在不同的操作系统和版本上进行测试,以确保兼容性。

通过以上步骤和技巧,你可以有效地避开Qt应用程序部署过程中常见的陷阱,确保你的应用在目标机器上顺利运行。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号