编程与调试 C++ -- Qt 的 LGPL 协议

Qt 的 LGPL 协议是否意味着可以自由用 QT 开发商业软件? from zhihu

QT 共享协议

授权后可闭源发布,具体如下:

  1. 应提供一个申明,说明贵公司正在将 LGPL 协议授权与应用程序的每个副本一起使用;
    • 加个软件加上开源协议使用申明
  2. 应提供完整许可证文本的副本,即 GPL 和 LGPL;
    • 产品目录带上协议副本
  3. 如果要显示任何版权声明,还需要正确显示 Qt 所有版权和商标;
    • 在软件 about 代码 logo 和 所有权
  4. 需要确保共享对开源许可软件(Qt)所做的所有修改;
    • 强制要求不做任何修改
  5. 必须在每份副本中通知没有保修的情况,即所涉及的开源代码不对客户承诺保修;(软件产品中的部分代码无保修似乎不太可能)
    • 用户协议,对开源部分不承诺保修
  6. 获知在使用 LGPL v3 库时,不可能实现或强制实施软件专利;
    • 申请专利,带上开源库可能申请不通过
  7. 如果使用 GPL 库,那么无论是否修改代码,将要求全部公开基于 GPL 库开发的所有引用的代码;
    • 我们软件里面都不能使用 GPL 库。可以都使用 GPL 软件工具
  8. 如果是动态链接,则需要公开调用库的接口代码,以确保软件接收者可以做到逆向修改。
    • LGPL 封装并且开源

an opensource wrapper to pass qt LGPL license.

查过很多资料了,将商业软件与 Qt LGPL 的关系归结如下:

  1. 必须使用 Qt 的 LGPL 许可版本;
  2. Qt 的库必须是动态链接,否则会有不必要的麻烦;
  3. Qt 的库最好不与产品同时发布(QT 官方建议 Qt 软件从 Qt 官方网站下载 Qt 库,否则会违反为 GLPL 协议)。

但你会发现 Qt 提供的下载地址很难打得开。个人觉得这一条基本可以忽略,仅需遵循第 2 条即可;或者你可以用 2 张光盘,一张用来发布,另一张用来提供 Qt 的共享库。

源码貌似:

-confirm-license Automatically acknowledge the LGPL 2.1 license.

Qt 的 License 变化历程

https://www.cnblogs.com/linuxAndMcu/p/16359738.html

Qt 2 后源码授权许可证开始使用 GPL,Qt 4.0 发布时它拥抱了 GPLv2,2009 年收购 Trolltech 诺基亚为 Qt 加入了 LGPLv2.1,LGPLv2.1 存在漏洞,没有澄清使用修改库的问题,这个漏洞被企业广泛利用开发锁定的设备,开发者认为,使用 LGPLv2.1 授权的修改版 Qt 去创建锁定设备伤害了 Qt 的生态系统。

因为设备不对第三方公开,对生态系统没有任何贡献。LGPLv2.1 没有保护用户的自由,自由软件基金会的 LGPLv3 解决了这个问题。LGPLv3 开源许可证将能在用户使用开源版的 Qt 时确保用户自由,LGPLv3 明确禁止封闭嵌入式设备分发 LGPLv3 授权的软件。

从 5.4 开始 Qt 将采用 LGPL v2.1、LGPL v3 和商业许可证授权,而新的附加模组将只在 LGPL v3 和商业许可证发布。在 Qt 4.0 到 Qt 5.3 的版本使用 LGPLv2.1,并且随着版本的更新越来越多的模块不再使用 LGPLv2.1。

Qt License 更改的官方新闻:https://www.qt.io/blog/2014/08/20/adding-lgpl-v3-to-qt

文章 1

from 如果你因某种原因必须静态链接一个基于 LGPL 协议发布的库(一下我们简称为 LGPL 库),那么,你有义务进行下面的工作:

  1. 你必须在你的文档中说明,你的程序中使用了 LGPL 库,并且说明这个库是基于 LGPL 发布的;
  2. 你必须在你的应用程序发布中包含一份 LGPL 协议,通常就是那个文本文件;
  3. 你必须开放使用了 LGPL 库代码的所有代码,例如某些封装器。但是,其他使用这些封装器的代码就不需要开放了; 你必须包含你的应用程序的余下部分的目标文件(通常就是我们所说的 .o 等等),或者是其他等价的文件。源代码并不是必须的。

是不是很难理解呢?我们详细的说一下。

第一条很容易理解;第二条也很容易理解,你可以在这里找到 LGPL 协议的内容,复制下来随你的程序一起发布就可以了。第三条就不那么好理解了。简单来说,LGPL 协议要求,如果你的类使用了 LGPL 库的代码,那么必须把这个类开源。例如,如果你的程序 app.exe 每个源文件都使用了 LGPL 库的代码,那么你的所有源代码都要开源。为了避免这种情况,我们通常编写一个封装器,把 LGPL 库的代码封装起来,这样就只需要开放这个封装器的代码,而其他使用了这个封装器的代码就不需要开放。第四条是对第三条的一种补充:那些使用了封装器的程序不需要开源,但是你必须把你编译的那些中间文件开放出来,Windows 下就是那些 .o 文件。

你很奇怪,为什么 LGPL 协议要这样规定呢?LGPL 所做的工作是,它保证了用户能够有这样一种能力:修改你使用 LGPL 库函数的方式(那些封装器就是你使用 LGPL 库的方式,那些已经开源了),重新编译这些代码,然后重新对程序进行连接(连接所需要的目标文件也是包含了的,这是第四条规定的),就可以得到一个新的可执行程序。

好了,如果你还不明白如何使用,我们来看一个例子。

假设我们使用一个名为 Lib 的库,这个库是基于 LGPL 协议发布的。如果你使用 Lib.dll 做动态链接(Windows 下),好,一切 OK。无论你的程序怎么样,你都可以做你所做的事情。

我们主要是来看,如果你要使用静态链接,那么你需要如何组织你的代码。如果你有一个 main.cpp(我们假设所有 Lib 库的函数都是用了 lib_ 前缀):

// main.cpp
int main() {
    lib_init();
    lib_do_something();
    lib_done();
    lib_close();

    return 0;
}

现在你已经完成了 main.cpp,但是你必须把它开源!因为它使用了 LGPL 库的代码。这是上面第三条规定的。我不想把它开源,怎么办呢?好,我们建一个新的文件 lib_wrapper.cpp:

void my_lib_init() {
    lib_init();
}

void my_lib_do_something() {
    lib_do_something();
}

void my_lib_done() {
    lib_done();
}

void my_lib_close() {
    lib_close();
}

在 main.cpp 中,我们做相应的修改 :

int main() {
    my_lib_init();
    my_lib_do_something();
    my_lib_done();
    my_lib_close();

    return 0;
}

现在,main.cpp 不再是直接使用了 LGPL 库的代码了,因此它不需要开源,而我们的封装器 lib_wrapper.cpp 必须开源。

好,编译一下我们的程序,你会得到 main.o(Windows 下)这个目标文件。

在最终程序的发布中,你需要包含一下文件:

一份文档,其中声明:这个程序使用了 Lib 库,这个库是基于 LGPL 协议发布的; LGPL.txt; lib_wrapper.cpp main.o 这样,用户可以通过修改 lib_wrapper.cpp 的内容改变你使用 LGPL 库的方式,例如:

void my_lib_done() {
    lib_done();
    lib_close();
}

void my_lib_close() {
    // lib_close();
}

然后编译这个 lib_wrapper.cpp,最终重新链接。一个新的可执行程序诞生啦!

文章 2

LGPL 允许商业软件通过类库引用 (link) 方式使用 LGPL 类库而不需要开源商业软件的代码。

  1. 你的应用程序应该动态链接 Qt 函数库,并使你的应用程序与未做修改的 LGPL 库分开发布。同时必须确保使用者(接受者)知道应用程序使用了 LGPL 版本的 Qt;
  2. 如果你对 LGPL 版本的 Qt 进行了任何修改,并发布,则必须遵循 LGPL 条款发布。任何使用者有权利得到这些修改(通常情况下是源代码),并且确保使用者可以通过这些修改自己生成相应你修改过的 Qt 版本。

from link 直接给您结论:

你公司用 Qt 开发闭源商业桌面软件,在 windows/mac/linux 上,可以使用动态库链接方式,遵循 LGPL 协议,是不用付费的,也不用开源你的代码。

只需在你的商业软件的 about 什么小角落,说明你使用了 Qt,遵循 LGPLV3 协议即可,你公司就可以开发闭源的商业软件。

那商业付费什么意思呢? 就是指的你使用静态库链接的方式,是要付费的。

  1. 首先,嵌入式 linux 开发,如果你自己手动编译 Qt 动态库,链接动态库。并说明你遵循 LGPL, 也是可以开发闭源商业软件的。
  2. 移动端,iOS/Android 开发。虽然 iOS/Android。目前都支持动态链接方式。 但很明显,Qt 公司就是想让你付费。
  3. 最明显的就是 iOS 的库,Qt 公司只提供了静态链接方式。如果你要开发 iOS,你得自己去编译动态链接库,Qt 公司也没告诉你如何编译动态库。

开源许可证教程

如何选择开源协议 世界上的开源协议有上百种(有兴趣的读者请猛击 这里 了解),很少有人能彻底搞清它们之间的区别,即使在最流行的六种开源协议 —— GPL、BSD、MIT、Mozilla、Apache 和 LGPL —— 之中做选择,也很复杂。

乌克兰程序员 Paul Bagwell 画了一张分析图,说明应该怎么选择开源协议,大家看了一目了然,真是清爽。 图片来自于阮一峰博客:如何选择开源协议

各种开源协议是否可商用及如何规避

from note

常用的开源协议:

  • BSD 类,如 Apache/BSD/MIT 等:
    • 可商用无风险。
  • MPL 类,如 MPL/EPL 等:
    • 无修改无需开源,修改部分要开源。
  • LGPL:
    • 具有传染性。产品对外分发或销售时静态链接的相关代码要开源,因此商用时需要动态链接使用。
  • GPL:
    • 具有传染性。产品对外分发或销售时链接的相关代码要开源,因此商用时要进程隔离。
  • AGPL:
    • 具有传染性。产品即使不对外分发或销售,链接的相关代码也要开源,因此商用时要进程隔离。

补充:

  • 博客中常见 cc 协议:
  • cc 协议中 nc 代表不可商用,有 nc 标志的就不要考虑商用了,其他标志可以。

Qt 发布版权问题,是否需要公开源码?开源版与商业版的区别? from

桌面端

不用静态编译别修改 Qt 源码就可以了,就一堆 dll 加上 exe 这种方式就是合法的。 默认你用 windeployqt 生成的那个打包下就可以了。这个理论上还要求你写软件说明的时候声明下用了 Qt 程序库,Qt 程序库是 LGPL 协议的,把 lgpl 协议的文档弄个文本文件跟你的程序放一起。 就类似下面这种,exe 跟 dll 一起,有个 LGPL 文档说明,软件的帮助或者配套文件里说下用了 LGPL 协议的 Qt 就行了。 国内用 Qt 商用的很多,商业完全没问题的。Qt 的 Python 绑定特意出了个 PySide 就是为了支持 LGPL 好支持商用,PyQt 不支持 LGPL,商用不友好。

嵌入式

Qt 公司宣布改变 Qt 跨平台应用开发框架的许可证授权。新版的 Qt 将在一个商业许可证、GPLv2、GPLv3 和 LGPLv3 下授权,不再使用 LGPLv2.1 授权。 Qt 公司称,更新的开源许可证将能在用户使用开源版的 Qt 时确保用户自由,LGPLv3 明确禁止封闭嵌入式设备分发 LGPLv3 授权的软件, 在 LGPLv3 下分发的软件还向所有软件的接收者给予了专利许可。

结论?

from 闭源商业软件免费使用 LGPL 版的 Qt 必须满足如下条件:

  1. 不修改 Qt 源代码。
  2. 必须用动态链接的方式使用 Qt 库。
  3. 在软件版权声明中说明使用了 LGPL 版本的 Qt、说明具体使用了那些 Qt 库,并确保软件使用者了解。
  4. 在发布的软件中包含 Qt 原有版权声明。

另:满足以上条件后发布的程序中可以附带 Qt 动态库(即打包在一个安装包中)。

an opensource wrapper to pass qt LGPL license.

Qt 的 Python 绑定特意出了个 PySide 就是为了支持 LGPL 好支持商用,PyQt 不支持 LGPL,商用不友好。

Some new modules like Charts, CoAP and MQTT were only available under Qt Commercial until Qt 5.15.

@Fabrice: All licenses are same with Qt 5.15.1 and Qt 5.15.0. The LTS change to commercial means that patch releases are commercial only during the long-term-support phase, i.e. after the next version of Qt is available.

https://embeddeduse.com/2021/04/18/using-qt-5-15-and-qt-6-under-lgplv3/


Essential Qt modules: all under LGPLv3

Qt add-on modules under LGPLv3 (Part 1)

Qt add-on modules under LGPLv3 (Part 2)

Qt modules under commercial licenses (Part 1)

Qt modules under commercial licenses (Part 2)

Total cost for embedded Linux system with Qt LGPLv3 vs. Qt Commercial

参考资料快照
参考资料快照

本文短链接:
If you have any questions or feedback, please reach out .