如何在Linux上部署Qt应用程序

14

我按照 Qt 文档中提到的步骤成功完成了以下操作:

但是,我仍然无法生成静态 Qt 应用程序,由上述文档步骤生成的可执行文件在其他系统上仍然需要 Qt 共享对象。

有什么想法吗?


在使用 -static 标志构建 Qt 本身之后,你确定你的应用程序已使用正确的 Qt 版本构建,并且静态库已链接吗? - SingerOfTheFall
你在使用QML吗? - Benp44
我不确定您是否可以完全静态链接到QML库和.qml文件。我正在使用Qt的静态链接,但我仍然需要部署一些QML组件。 - Benp44
你不能使用系统的Qt吗? - rubenvb
是的,我必须部署应用程序,但我不知道使用我的应用程序的人是否在他们的系统中安装了Qt。@rubenvb - Ankit Rawat
显示剩余8条评论
2个回答

15

为了部署应用程序,我使用cqtdeployer工具。

这个工具会自动收集应用程序所需的所有依赖项,您无需花费时间来完成此过程,或者您可以自动化此过程。

您可以从github发行版(Windows)安装

或者

snapstore(Linux)安装

sudo snap install cqtdeployer

您可以按照以下方式使用:

  • Windows:
%cqtdeployer% -bin myApp -qmake path/to/Qt/5.x.x/build/bin/qmake.exe -qmlDir path/to/my/qml/files/dir
  • Linux:
cqtdeployer -bin myApp -qmake path/to/Qt/5.x.x/build/bin/qmake -qmlDir path/to/my/qml/files/dir
  • path/to/Qt/5.x.x/build/bin/qmake - 这是使用qmake构建程序的方式。

  • path/to/my/qml/files/dir - 这是直接指向您编写的QML文件的路径。

并使用sh脚本(Linux)或exe(Windows)运行应用程序。

如果您使用的是snap版本,请确保您拥有所有权限。 cqtdeployer

如果您需要使用Windows版本,只需从安装程序中安装应用程序。

更新

如果要为应用程序创建简单的安装程序,只需在cqtdeployer命令的qif选项中添加。 示例:

cqtdeployer -bin myApp -qmake path/to/Qt/5.x.x/build/bin/qmake -qmlDir path/to/my/qml/files/dir qif

有关cqtdeployer的所有复杂细节都可以在官方wiki项目中找到。


cqtdeployer 为 Linux 生成哪种类型的软件包? - Silicomancer
1
@Silicomancer 如果你想使用cqtdeployer创建软件包,那么目前只支持QIF安装程序和zip压缩包(从1.5版本开始)。未来计划增加对snaps和deb软件包的支持。如果你是想获取cqtdeployer的软件包,则可以从snap软件包和qif安装程序中进行安装。具体操作请参考链接:https://github.com/QuasarApp/CQtDeployer/wiki/Build-and-Install#installation-without-building。 - Andrey Yankovich
关于创建软件包。Snap 或 AppImage 就是我正在寻找的东西。谢谢! - Silicomancer
@Silicomancer 我计划添加创建snap软件包的支持,但我还没有开始这项任务。现在正在进行的是创建自包含的deb软件包 - Andrey Yankovich
1
终于找到了一个真正有效的答案!完全自动化,允许您在Ubuntu Linux上分发QT项目而不违反GPL许可证。 - Ronen

1
最佳部署应用程序的方法不一定是静态链接,原因如下:
  • LGPL许可证意味着您的应用程序现在必须公开并且不能出售(我想)-即。由于它是静态链接的,qt库在您的可执行文件中,因此您的可执行文件现在是开源的一部分。
  • 这是非常麻烦的...我已经走了很多弯路,深知其中的痛苦。

安装qt-everywhere也不太好,我只是看不到您如何保证库与程序需要的版本相同。

因此,我开始创建自己的脚本来为我部署qt。这个基本的“jist”的内容是使用ldd找出您需要哪些qt库,并将它们复制到子文件夹(./lib)中,与您的可执行文件位于同一个文件夹中,以创建一个安装包。

注意:在Windows上,有一个名为deployqt的应用程序,可以做类似的事情(无法记住确切的名称)。

我已经复制了一个版本的部署脚本。请注意,它现在相当老旧,但我认为它仍然可以使用(它不是特别好写的),如果不能使用,那么它将给你一个起点。还要注意插件。在这个脚本中,我添加了一些代码来复制音频插件,因为我正在使用它。如果您使用其他插件,则需要复制它们(它们通常位于qt库的子目录中,例如.../audio)。我曾经想过尝试从.pro文件中找出需要哪些插件,但我从未完成过(我还需要将.pro文件传递给这个脚本)...
要运行,请运行此脚本并传递可执行文件所在的目录。
#!/bin/bash

# Rememeber start dir
START_DIR=$PWD

# Determine which dir to deploy in and cd to that dir
if [ -d "$1" ]; then
   DEPLOY_DIR=$1
else
   DEPLOY_DIR=$PWD
fi
echo "Deploy dir: $DEPLOY_DIR"
cd $DEPLOY_DIR

# Run ldd on all files in the directory and create a list of required qt libs
flag=false
for entry in `ldd $DEPLOY_DIR/* | grep -i qt`; do
   if $flag; then
      # Only add to the array if it is not already in it
      if ! [[ $libsArray =~ $entry ]]; then
         echo "adding $entry"
         libsArray="$libsArray $entry"
      fi
      flag=false
   fi

   # If we see a "=>" then the next line will be a library
   if [ $entry == "=>" ]; then
      flag=true
   fi
done
echo 
echo

# Create the required folder structure. Note here we are need the qt audio plugin so we are going to manually copy that as well.
mkdir -p lib
mkdir -p lib/audio
# Now copy these files to the deploy directory
for entry in $libsArray; do
   echo "cp -v -f $entry $DEPLOY_DIR/lib"
   cp -v -f $entry $DEPLOY_DIR/lib
done

# Now get the audio lib - this is a plugin that we are using so we need these libs as well.
# Add other plugins here as well.
# TODO: maybe we can read this in from the *.pro file.
cp -v -f `qmake -query QT_INSTALL_BINS`/../plugins/audio/* $DEPLOY_DIR/lib/audio

# Go back to start dir
cd $START_DIR

一旦您拥有所需的所有文件,您应该能够将它们全部复制到另一台计算机并运行。注意:您可能需要设置 export LD_LIBRARY_PATH=<path-to-libs> 以便找到库...或将库安装到类似于 /usr/lib/your-appplication/ 的位置中。但是,安装库是另一个问题/主题!

2
你的应用程序必须是公开的,且不能出售。在 Qt LGPL 或 LGPLv3 中没有这样直接的限制。针对以下问题:我可以使用社区开源版本来开发我的商业产品吗?以及 “使用的作品” 的评论在这里:当在LGPL下使用Qt时,我的义务是什么? - Mohammad Kanan
1
@mohammadkanan 是的 - 这就是(其中之一的)静态链接是一种不太理想的方法的原因。使用动态链接就不会有这个问题。 - code_fodder
1
感谢提供这种不需要反复尝试的半自动化方法。除了本地所需的库之外,该脚本还获取了部署所需的主要Qt库。 - guitarpicva
@guitarpicva 谢谢 - 尽管 cqtdeployer 看起来可能是要使用的工具 - 但在我编写这个脚本时它还不存在(至少我不知道)- 它看起来做得很好,但我没有使用过。不过,如果你想要一种轻量级的方式,这对我来说已经足够好了:) - code_fodder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接