如何在符合LGPL的Linux上部署Qt5应用程序?[已关闭]

svmlkihl  于 12个月前  发布在  Linux
关注(0)|答案(2)|浏览(85)

**已关闭。**此问题不符合Stack Overflow guidelines。它目前不接受回答。

这个问题似乎不是关于在help center定义的范围内编程。
8年前就关门了。
Improve this question
最近,我成功地将我的Qt 4应用程序迁移到了Qt 5。实际上,应用程序使用来自qt-opensource-linux-x64-5.3.1发行版的预构建二进制Qt 5库在开发机器上构建和运行。
因为我的应用程序需要符合LGPL 2.1许可证,所以到Qt 5的链接必须是动态的。(所以我可以静态链接到Qt!)
我的问题是这个应用程序的部署。我只是不能想出一个包含所有可共享库的包,它可以在现有的Linux发行版上运行。
我可以容忍用户需要自己从qt-opensource-linux-x64-5.3.1二进制文件安装Qt 5的要求。事实上,这将确保更严格地遵守LGPL 2.1。因此,我可以假设兼容的Qt 5库已经安装并在主机上可用(尽管我不知道我是否可以假设Qt安装的特定目录)
但是,我不清楚如何将应用程序打包以便在主机上运行。任何帮助将不胜感激!

polhcujo

polhcujo1#

我以为其他有类似问题的人会对我最终做的事情感兴趣。因此,我尝试了一些对我来说最简单的标准预构建二进制Qt 5共享库的动态链接。事实证明,我可以提出一个在以下Linux发行版上工作的发行版:CentOS 7 64位,Ubuntu 12.04 64位和Slackware 14.1 64位与KDE桌面。技巧是not包含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
我希望这是有帮助的。

ef1yzkbh

ef1yzkbh2#

IANAL

LGPL的一个经常被误解的方面是它需要动态链接。不是的它只需要获得代码的一方能够将其与LGPL库重新链接,他们能够从您使用和提供的源代码中重建这些库,以构建应用程序附带的Qt。
动态链接根据定义来处理这一点,因为每次启动应用程序时都会执行链接(预链接只是一个缓存),并且库的源代码是可用的(在发行版的包中)。
因此,您需要做的就是将应用程序拆分为两个项目:
1.包含所有代码的静态库项目(.a)。这是封闭源代码部分。
1.将静态库与Qt库、C++运行时等链接的应用程序可执行文件。在这一点上,Qt库是静态链接还是动态链接并不重要。
为了与LGPL兼容,您的用户必须能够根据LGPL的条款获得执行步骤#2所需的所有文件(在最简单的情况下,只需.pro文件!),以及步骤#1中的静态库(.a)。
实际上,第2步可以很容易地提供一种特定于平台的方式来链接您的项目和本地安装的Qt。例如,如果你的目标是RedHat系统,你可以使用以下脚本:

#! /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

您需要引用静态库中的至少一个符号才能将其链接。这也避免了a different problem peculiar to MSVC。举例来说:

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

一个最小的包需要四个文件:MiroProject.sh-上面的脚本,来自步骤#1的MiroProject.adummy.cppMiroProject.pro。当然,你必须提供你用来构建MiroProject.a的Qt库的源代码。
理想情况下,您的软件包应该包括整个shebang:Qt源代码、封闭源代码.a.lib、开源 Package 器以及构建所有这些的脚本。

IANAL

相关问题