【问题标题】:How to deploy Qt applications for Linux如何为 Linux 部署 Qt 应用程序
【发布时间】:2021-10-03 14:57:14
【问题描述】:

我成功地遵循了 Qt 文档中提到的所有步骤:

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

有什么想法吗?

【问题讨论】:

  • 使用-static 标志构建Qt 本身后,您确定您使用正确的Qt 版本构建了自己的应用程序,并且静态库已链接?
  • 我做了 ldd 来查看可执行文件是否没有与任何系统共享对象链接,但尽一切努力将其仍然链接到系统的 Qt 共享对象,我也尝试过它在其他 Linux 系统上运行,但它没有不工作
  • 你在使用 QML 吗?
  • 是的,我同时使用 c++ 和 qml @Benp44
  • 我不确定您是否可以完全静态链接到 QML 库和 .qml 文件。我正在使用到 Qt 的静态链接,但我仍然需要部署一些 QML 组件

标签: c++ linux qt deployment qt4


【解决方案1】:

您需要部署应用程序,为此我使用该实用程序 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 中的版本,请确保您拥有所有权限。

如果您需要使用 windows 版本,只需从installer 安装应用程序

更新

如果您想为您的应用程序创建一个简单的安装程序,只需为 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 如果您要使用 cqtdeployer 创建包,那么它只是 QIF installers and zip arhive(从 1.5 版开始)。有计划增加对 snaps 和 deb 包的支持。如果您了解 cqtdeployer 的软件包,则可以从 snap package and qif installer 安装 cqtdeployer。
  • 关于创建包。 Snap 或 AppImage 本来就是我想要的。谢谢!
  • @Silicomancer 我计划添加对创建快照包的支持,但我仍然没有承担这项任务。现在正在创建自包含的deb packages
【解决方案2】:

部署应用程序的最佳方式不一定是静态链接,原因如下:

  • 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

获得所需的所有文件后,您应该能够将整个文件复制到另一台 PC 并运行它。注意:您可能必须设置 export LD_LIBRARY_PATH=<path-to-libs> 以便可以找到库...或将库安装到 /usr/lib/your-appplication/ 之类的地方。

但安装库是另一个问题/主题!

【讨论】:

  • 您的应用程序必须公开且不得出售:Qt LGPL 或 LGPLv3 中没有此类直接限制。关注:Can I use the Community open source version to develop my commercial product?“使用的作品” 在此处评论:What are my obligations when using Qt under the LGPL?
  • @mohammadkanan 是的 - 这就是为什么(一个原因)静态链接是一种不太理想的方法。使用动态链接,这不是问题
  • 感谢您提供了一种很好的半自动化方式,无需一遍又一遍地进行“剪切和尝试”。除了本地需要的库之外,该脚本还获取部署所需的主要 Qt 库。
  • @guitarpicva 谢谢 - 虽然看起来 cqtdeployer 可能是要使用的工具 - 在我编写这个脚本时它并不存在(据我所知) - 它看起来我>喜欢它做得很好,但我没有使用它。仍然 - 如果您想要一种轻量级的方式,这对我来说已经足够好了:)
猜你喜欢
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多