Qt 的 LGPL 协议是否意味着可以自由用 QT 开发商业软件? from zhihu
授权后可闭源发布,具体如下:
查过很多资料了,将商业软件与 Qt LGPL 的关系归结如下:
但你会发现 Qt 提供的下载地址很难打得开。个人觉得这一条基本可以忽略,仅需遵循第 2 条即可;或者你可以用 2 张光盘,一张用来发布,另一张用来提供 Qt 的共享库。
源码貌似:
-confirm-license Automatically acknowledge the LGPL 2.1 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
from 如果你因某种原因必须静态链接一个基于 LGPL 协议发布的库(一下我们简称为 LGPL 库),那么,你有义务进行下面的工作:
是不是很难理解呢?我们详细的说一下。
第一条很容易理解;第二条也很容易理解,你可以在这里找到 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,最终重新链接。一个新的可执行程序诞生啦!
LGPL 允许商业软件通过类库引用 (link) 方式使用 LGPL 类库而不需要开源商业软件的代码。
你公司用 Qt 开发闭源商业桌面软件,在 windows/mac/linux 上,可以使用动态库链接方式,遵循 LGPL 协议,是不用付费的,也不用开源你的代码。
只需在你的商业软件的 about 什么小角落,说明你使用了 Qt,遵循 LGPLV3 协议即可,你公司就可以开发闭源的商业软件。
那商业付费什么意思呢? 就是指的你使用静态库链接的方式,是要付费的。
如何选择开源协议 世界上的开源协议有上百种(有兴趣的读者请猛击 这里 了解),很少有人能彻底搞清它们之间的区别,即使在最流行的六种开源协议 —— GPL、BSD、MIT、Mozilla、Apache 和 LGPL —— 之中做选择,也很复杂。
乌克兰程序员 Paul Bagwell 画了一张分析图,说明应该怎么选择开源协议,大家看了一目了然,真是清爽。 图片来自于阮一峰博客:如何选择开源协议
常用的开源协议:
补充:
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 必须满足如下条件:
另:满足以上条件后发布的程序中可以附带 Qt 动态库(即打包在一个安装包中)。
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/