Qt License分析

1. GPL与LGPL

1.1 GNU GPL合规的3个W

Copyleft许可证的目的正是确保某个程序或基于该程序的任何作品的所有用户至少拥有以下四项基本自由

  1. 自由地出于任何目的运行该程序,无需获得任何附加许可
  2. 自由地阅读、学习、理解和使用该程序源码所传授或包含的任何知识或技巧
  3. 自由地修改、改编、改进或二次使用该程序中的任何或全部代码
  4. 自由地将该程序分享给任何人或不予分享,无论是修改版还是原版

1.2 GPL(GNU General Public License)

我们很熟悉的Linux就是采用了GPL。GPL协议和BSD,Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了

GPL协议的主要内容是只要在一个软件中使用(”使用”指类库引用,修改后的代码或者衍生代码)GPL协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势

由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础

其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似

1.3 LGPL(GNU Lesser General Public License)

LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售

但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品

1.4 LGPLv2与LGPLv3

LGPLv2和LGPLv3有什么区别呢,这里又不得不说到GPLv2和GPLv3,因为LGPL是GPL协议的宽松许可

与LGPLv3混淆的一个可能领域是它引用了GPLv3。实际上,LGPLv3是GPLv3许可证的一组特殊例外。因此,您可能听说过LGPLv3对DRM和专利有限制,但您不会在LGPLv3中找到详细信息,因为它引用了GPLv3的相关部分。这是LGPLv3和LGPLv2.1之间的主要结构差异,后者实际上是一个独立的许可证,它是独立的,可以单独检查

GPLv3协议中讨论最为广泛的新要求,即要求在“用户产品”中提供GPLv3代码的“安装信息”。提供“安装信息”要求旨在保护用户权利,让用户可以修改其所购买和使用的产品中嵌入的GPLv3代码,并运行修改后的版本。如果没有此条款,则“锁定”设备以阻止法定持有人修改软件便会损害GPL许可证作者希望用户拥有的自由权利。如果所有嵌入式设备都执行此类锁定,则如美国最高法院曾经说过的一样,GPL所保证的自由权就会变成“空头支票”(Edwards v. California, 314 U.S. 160, 186 (1941) (Jackson, J. concurring)

扫描二维码关注公众号,回复: 9219117 查看本文章

“用户产品”指

  1. “消费品”,即通常用于个人、家庭或日常使用的有形个人财产
  2. 任何为了安装到住所而设计或销售的产品

“用户产品”在通过永久转让所有权或控制权,或者基于固定期限出借或出租时,产品中GPL程序的非源码形式副本便已向用户发布。向用户提供对应源码时应随附足够的技术信息,方法、过程、授权密匙,或安装和执行用户产品中的修改版GPL软件所需的其他信息。这些信息必须足以保证修改后的目标码不会仅因遭到修改而无法继续执行

除非设备中采用了技术措施来阻止修改版本的安装和执行,否则此要求无关紧要。因此从2007年以来的经验可以看出,如果生产厂商想要锁定其产品,则应避免使用GPLv3软件

1.5 LGPL开发闭源程序

LGPL协议是一个商业友好的协议,使用LGPL开发闭源程序,有以下两种情况

  1. 使用动态链接的形式,那么可以以任何形式发布你的应用程序,商业的、非商业的、开源的、非开源的
  2. 因某种原因必须静态链接一个基于LGPL协议发布的库,那么,你有义务进行下面的工作
    - 你必须在你的文档中说明,你的程序中使用了LGPL库,并且说明这个库是基于LGPL发布的
    - 你必须在你的应用程序发布中包含一份LGPL协议,通常就是那个文本文件
    - 你必须开放使用了LGPL库代码的所有代码,例如某些封装器。但是,其他使用这些封装器的代码就不需要开放了
    - 你必须包含你的应用程序的余下部分的目标文件(通常就是我们所说的 .o 等等),或者是其他等价的文件。源代码并不是必须的

特别是对于嵌入式来说,如果生产厂商想要锁定其产品,不允许用户修改,则应避免使用LGPLv3协议发布的软件

2. Qt License

2.1 License变化历程

从5.4开始Qt将采用LGPL v2.1、LGPL v3和商业许可证授权,而新的附加模组将只在LGPL v3和商业许可证发布

Qt 2后源码授权许可证开始使用QPL,Qt 4.0发布时它拥抱了GPLv2,2009年收购Trolltech诺基亚为Qt加入了LGPLv2.1,LGPLv2.1存在漏洞,没有澄清使用修改库的问题,这个漏洞被企业广泛利用开发锁定的设备,开发者认为,使用LGPLv2.1授权的修改版Qt去创建锁定设备伤害了Qt的生态系统。因为设备不对第三方公开,对生态系统没有任何贡献。LGPLv2.1 没有保护用户的自由,自由软件基金会的LGPLv3解决了这个问题

在Qt 4.0到Qt 5.3的版本使用LGPLv2.1,并且随着版本的更新越来越多的模块不再使用LGPLv2.1,下图显示了Qt 5.6的Qt许可方案
Qt 5.6许可方案
LGPLv2.1下的所有模块(WebEngine模块除外)也可在LGPLv3下使用。WebEngine依赖于Chromium的第三方代码,因此无法提升到LGPLv3。在Qt 5.4中引入了LGPLv2.1和LGPLv3的“双重”许可。Qt 5.4或更高版本中引入的新模块仅在LGPLv3下发布。这就是3D,QuickDialogs和QuickControls等模块都在LGPLv3下的原因

上图中标有“Other Tools”的框代表QtCreator,qmake,moc,rcc,lupdate,lrelease和linguist等工具。它们都是在GPL下提供的。这在商业环境中使用不是问题,因为这些是在自己的进程中运行的独立工具,并且绝对不会链接到您的应用程序中。qmake,moc和rcc等工具生成的代码不在GPL下,但可以在闭源软件中自由使用。这类似于GPLed gcc和g ++编译器生成的代码

QML编译器,虚拟键盘和QML 2D软件渲染器等黑色模块仅在商业Qt许可下可用

下图显示了未来版本的Qt许可方案
Qt 5.7许可方案
与第一个图表的最大区别在于所有蓝色模块(LGPLv2.1)已经变成绿色模块(LGPLv3),除了WebEngine模块,最棒的是QML编译器将在LGPLv3下可用!

2.2 Qt中使用LGPLv3

当您在LGPLv3下使用Qt时,您有三个主要义务

  1. 您的应用程序应将Qt库链接为共享库
  2. 您必须公开提供Qt源,包括您对Qt源的修改。例如,您可以在您的网站或GitHub上提供Qt源以供下载。您可以保持应用程序的闭源
  3. 您必须使用户能够为目标设备构建Qt源(例如,汽车或洗衣机中的信息娱乐系统),在目标设备上部署Qt库并使用目标设备上的修改后的Qt库运行原始应用程序

前两个义务与LGPLv2.1相同,第三项义务是使用LGPLv3的软件禁止锁定设备,而LGPLv2.1可以完全锁定并被广泛使用

您必须提供交叉编译工具链以及必要的库,标头,文件和工具,以便用户可以为目标设备构建修改后的Qt版本。满足此义务的一种非常简单的方法是将工具链安装在虚拟机中,并使用户可以使用该虚拟机

此外,您必须提供在目标设备上部署应用程序(通常是二进制文件)和新Qt版本的方法

最后,您必须提供一种方法来运行在目标设备上针对新Qt版本链接的应用程序

公司与LGPLv3的主要问题是他们必须为用户提供对其设备的访问权限,GPLv3和LGPLv3要求允许最终用户安装和执行软件的修改版本(即Qt)。对于桌面应用程序,Qt通常作为动态链接库提供,因此遵守LGPLv3并不困难。然而,许多嵌入式设备旨在被锁定,用户无法更新它们上的任何软件。这些类型的产品通常需要商业版的Qt。但并非所有嵌入式设备都必须使用Qt的商业版本,如果您能够遵守LGPLv3的条款,那么您可以根据该许可证使用Qt

2.3 Qt中使用LGPLv2

使用LGPLv2许可开发闭源的Qt应用程序,需要按照1.5小节的要求来开发,但是还需要注意的是,如果用到了Qt某些模块的功能,需要确保那个Qt模块也是LGPLv2许可的,这里就涉及到Qt版本的选择

下面是根据各个版本每个模块LICENSE的一个比较,从5.4之后,很多模块都是LGPLv2.1和LGPLv3的“双重”许可,这里只关注LGPLv2.1,并且采用LGPLv2.1的模块会随着Qt版本的更新而逐渐减少

5.3.2对比5.4.2
5.3.2对比5.4.2
5.4.2对比5.5.1
5.4.2对比5.5.1
5.5.1对比5.6.2
5.5.1对比5.6.2
5.6.2对比5.7.1
5.6.2对比5.7.1
5.7.1与5.8.0是一样的就不对比了,下面是5.8.0对比5.9.8
5.8.0对比5.9.8
5.9.8对比5.10.1
5.9.8对比5.10.1
5.10.1对比5.12.3
5.10.1对比5.12.3
可以清楚的看5.8.0和5.9.8版本的对比,用LGPLv2的模块急剧减少,因此可选的Qt版本是5.3.2到5.8.0之间,可以根据需要的模块选择不同的版本

3. 参考文献

[1] GPLv3 & LGPLv3 | 简介
[2] 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)
[3] LGPL与闭源程序
[4] Qt 5.4 可选 LGPL v3 许可证
[5] Using Qt 5.6 and Later under LGPL
[6] Changes to Qt Licensing
[7] Qt Licensing

发布了30 篇原创文章 · 获赞 28 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/anyuliuxing/article/details/90644884
QT