如何在Linux上部署符合LGPL的Qt5应用程序



最近,我已经成功地将Qt4应用程序迁移到Qt5。实际上,应用程序是使用qt-opensource-linux-x64-5.3.1发行版中预构建的二进制Qt5库在开发机器上构建和运行的。

因为我的应用程序需要符合LGPL 2.1许可,链接到Qt5必须是动态的。(所以我可以**不**链接到Qt静态!)

我的问题是部署这个应用程序。我只是不能想出一个包含所有可共享库的包,它可以在现有的Linux发行版中运行。

我可以容忍用户需要自己从qt-opensource-linux-x64-5.3.1二进制文件安装Qt5。事实上,这将确保更严格地遵守LGPL 2.1。因此,我可以假设兼容的Qt5库已经安装并且在主机上可用(尽管我不知道我是否可以假设Qt安装的特定目录)

然而,我不清楚如何包装我的应用程序以在主机上运行。任何帮助将非常感激!

我想其他有类似问题的人会对我最后做的事情感兴趣。因此,我尝试了对我来说最简单的标准预构建二进制Qt5共享库的动态链接。事实证明,我可以想出一个可以在以下Linux发行版上工作的发行版:64位的CentOS 7, 64位的Ubuntu 12.04, 64位的Slackware 14.1和KDE桌面。诀窍是而不是包含ldd命令显示的所有依赖项。相反,我的二进制发行版只包含以下文件:

+-platforms/
| +-libqxcb.so
+-libicudata.so.52
+-libicui18n.so.52
+-libicuuc.so.52
+-libQt5Core.so.5
+-libQt5DBus.so.5
+-libQt5Gui.so.5
+-libQt5PrintSupport.so.5
+-libQt5Widgets.so.5
+-qm
+-qm.sh

其中,qm为应用程序可执行文件,qm.sh为启动应用程序的bash脚本。脚本如下所示:

#!/bin/sh
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/qm "$@"

应用程序(qm)没有任何插件,只使用基本的Qt小部件库。

我应该补充一下,我使用的是二进制qt-opensource-linux-x64-5.3.1发行版:

http://download.qt-project.org/official_releases/qt/5.3/5.3.1/qt-opensource-linux-x64-5.3.1.run.mirrorlist

我希望这是有帮助的。

IANAL

LGPL的一个常见误解是它需要动态链接。它不是。它只要求获得代码的一方能够将与LGPL的库重新链接,他们能够从您使用的源代码中重新构建,并提供来构建随您的应用程序附带的Qt。

根据定义,动态链接处理这个问题,因为每次应用程序启动时都会执行链接(预链接只是一个缓存),并且库的源代码是可用的(在发行版的包中)。

所以,你所需要做的就是把你的应用程序分成两个项目:
  1. 包含所有代码的静态库项目(A)。这是闭源部分。

  2. 将静态库与Qt库、c++运行时等连接起来的应用程序可执行文件。在这一点上,Qt库是静态链接还是动态链接并不重要。

为了与LGPL兼容,您的用户必须能够获得执行步骤#2所需的所有文件(在最简单的情况下只是一个.pro文件!),以及步骤#1中的静态库(a)。

事实上,第2步使提供一种特定于平台的方式将您的项目与本地安装的Qt链接起来变得非常容易。

#! /bin/bash
# MiroProject.sh
yum install qt5-devel
qmake MiroProject
make install

项目文件如下所示,假设静态库位于与MiroProject.prodummy.cpp相同的位置。

# MiroProject.pro
template = app
LIBS += -L. -lMiroProject
SOURCES += dummy.cpp

您需要引用静态库中的至少一个符号以使其链接。这也避免了MSVC特有的另一个问题。例如:

// dummy.cpp
int main(int argc, char ** argv);
void dummy__reference() {
  main(0, 0);
}

一个最小的包需要四个文件:MiroProject.sh——上面的脚本,MiroProject.a从步骤#1,dummy.cppMiroProject.pro。当然,您必须提供您用来构建MiroProject.a的Qt库的源代码。

理想情况下,你的包应该包括所有的东西:Qt源代码,你的闭源.a.lib,开源包装器,和一个脚本来构建这一切。

<标题>首先

相关内容

  • 没有找到相关文章

最新更新