Qt许可证(GPLLGPL商业协议)
引⽂⼀:
Qt 有两个许可证:LGPL 和商业协议。这两个协议在现在的 Qt 版本中的代码是完全⼀致的(潜在含义是,Qt 的早期版本,商业版的Qt 通常包含有⼀些开源版本所没有的库,⽐如 QtSingleApplication 这个库)。所以现在对于普通开发⼈员和部分商业公司来说,使⽤LGPL 版本的 Qt 可以节省很⼤的开销。这两个版本最⼤的区别在于,前者是免费的,后者是收费的。既然代码都是⼀致的,所以费⽤就要是⽤来购买 Qt 的售后服务和培训等等相关服务。
现在我们是来说⼀下版权的问题。LGPL 是⼀个开源协议,因此,有⼈会担⼼ LGPL 能否⽤于开发闭源程序,能够拿来卖钱。尽管现在国内有些公司不是很重视这⽅⾯的问题,不过,如果你违反了协议,某⼀天被别⼈发来⼀纸律师函的时候,真的是欲哭⽆泪了哦。所以,我们还是先来研究⼀下这个协议,LGPL 究竟能不能⽤于开发闭源程序。
以下内容是我查了 N 多⽹站总结出来的,因为⾖⼦不是律师,所以 LGPL 协议基本看不懂。究竟怎样去理解这个协议,还是希望能够有专业⼈⼠说出来。这⾥就算做是⼀种抛砖引⽟吧!尽管没有⼗分的确定,但是这⾥所说的理解基本也是⼋九不离⼗的了。
⾄于什么是 LGPL 协议,这⾥就不再多说了,我们关⼼的是,如果使⽤ LGPL 协议开发商业程序。请注意,这⾥所说的闭源程序,是指不以某种形式开放源代码,也就是说,⽤户(包括其他开发者)不能获取其源代码的程序。⾸先说明⼀点,LGPL协议是⼀个商业友好的协议。这⾥的含义是,你可以⽤ LGPL协议开发商业程序,当然也可以是⾮商业的闭源程序。但是,它是有⼀些限制的。这就是我们要讨论的重点。
既然我们已经对其定性,那么我们直接进⼊主题:使⽤ LGPL 协议开发闭源程序,如果你使⽤动态链接的形式,那么,你可以以任何形式发布你的应⽤程序,商业的、⾮商业的、开源的、⾮开源的,随你。如果你因某种原因必须静态链接⼀个基于 LGPL 协议发布的库(⼀下我们简称为 LGPL 库),那么,你有义务进⾏下⾯的⼯作:
1.你必须在你的⽂档中说明,你的程序中使⽤了 LGPL 库,并且说明这个库是基于 LGPL 发布的;
2.你必须在你的应⽤程序发布中包含⼀份 LGPL协议,通常就是那个⽂本⽂件;
3.你必须开放使⽤了 LGPL 库代码的所有代码,例如某些封装器。但是,其他使⽤这些封装器的代码就不需要开放了;
4.你必须包含你的应⽤程序的余下部分的⽬标⽂件(通常就是我们所说的 .o 等等),或者是其他等价的⽂件。源代码并不是必须的。
是不是很难理解呢?我们详细的说⼀下。
第⼀条很容易理解;第⼆条也很容易理解,你可以在这⾥到 LGPL 协议的内容,复制下来随你的程序⼀起发布就可以了。第三条就不那么好理解了。简单来说,LGPL协议要求,如果你的类使⽤了LGPL库的代码,那么必须把这个类开源。例如,如果你的程序 每个源⽂件都使⽤了 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:
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 下)这个⽬标⽂件。
在最终程序的发布中,你需要包含⼀下⽂件:
1.⼀份⽂档,其中声明:这个程序使⽤了 Lib库,这个库是基于 LGPL 协议发布的;
;
3.lib_wrapper.cpp;
国内源代码网站4.main.o
这样,⽤户可以通过修改 lib_wrapper.cpp  的内容改变你使⽤ LGPL 库的⽅式,例如:
lib_done();
lib_close();
}
void my_lib_close()
{
// lib_close();
}
然后编译这个 lib_wrapper.cpp,最终重新链接。⼀个新的可执⾏程序诞⽣啦!
引⽂⼆:
Qt 4.5中提供了三种授权协议,分别是GPL, LGPL和Commercial,可能很多⼈要问,为什么同样的⼀个产品要提供三种授权协议,什么情况下使⽤什么的样的授权协议最合适?在这⾥我就⼤致解释⼀下:
GPL全称是The GNU General Public License,是⽬前⼤多数的GNU程序和超过半数的⾃由软件使⽤的许可协议。GPL的出发点是代码的开源/免费使⽤和引⽤/修改/衍⽣代码的开源/免 费使⽤,但不允许修改后和衍⽣的代码做为闭源的商业软件发布和销售。
GPL协议的主要内容是只要在⼀个软件中使⽤(”使⽤”指类库引⽤,修改后的代码或者衍⽣代码)GPL 协议的产品,则该软件产品必须也采⽤GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为⼀个单独的产品使⽤没有任何问题, 还可以享受免费的优势。
回到LGPL,LGPL的全称是 GNU Lesser General Public License,GNU 较宽松公共许可证,也是由协议是由⾃由软体基⾦会发布的许可证,是⼀个主要为类库使⽤设计的开源协议,和GPL要求任何使⽤/修改/衍⽣之GPL类库的的 软件必须采⽤GPL协议不同。LGPL允许商业软件通过类库引⽤(link)⽅式使⽤LGPL类库⽽不需要开源商业软件的代码。这使得采⽤LGPL协议的 开源代码可以被商业软件作为类库引⽤并发布和销售。
除了GPL和LGPL两种开源协议之外,Qt还提供了Commercial商业协议,Qt的商业协议是由Nokia定义的,由Nokia和购买⽅签 订的,具有法律效应的Qt产品授权协议。 Commercial License相教与GPL和LGPL,对于商业客户提供了更多的灵活性,客户可以任意的修改Qt的源代码,开发商业软件,⽽不需要公开任何源代码。并 且,在Commercial License中,我们还提供了技术⽀持服务。当然,商业授权协议是需要费⽤的。
到底什么时候需要选择GPL和LGPL呢?⼀个最显⽽易见的理由就是他们都是免费的,使⽤LGPL和GPL版本的Qt是不需要⽀付任何费⽤的,当然 我们也相应的不会提供技术⽀持。如果你打算开发真正
的开源软件,并希望使⽤者也可以保持开源,那么GPL是更好的选择,因为所有⼈,不论你⾃⼰还是将来基 于你的代码进⾏再次开发都必须开源。如果你打算开发闭源(不开放源代码)的商业软件,那么LGPL则更适合,但必须满⾜下⾯两个条件:
1. 你的应⽤程序应该动态链接Qt函数库,并使你的应⽤程序与未做修改的LGPL库分开发布。同时必须确保使⽤者(接受者)知道应⽤程序使⽤了LGPL版本的Qt;
2. 如果你对LGPL版本的Qt进⾏了任何修改,并发布,则必须遵循LGPL 条款发布。任何使⽤者有权利得到这些修改(通常情况下是源代码),并且确保使⽤者可以通过这些修改⾃⼰⽣成相应你修改过的Qt版本。
相信到这⾥⼤家已经对Qt提供的这三种协议有了基本的了解,通常⼤家还会有⼀个疑问,就是基于这三种授权协议的Qt产品到底由多少功能上的区别,是 不是商业版本的会更完整,性能更好⼀些?这⾥我可以负责任的说:99%的代码都是⼀样的,⽆论是GPL, LGPL还是Commercial,功能,性能都没有区别,唯⼀的区别就在于授权协议的不同。
还有⼀点需要说明的就是,由于LGPL是在Qt4.5这个版本⾥⾯才引⼊的,所以之前的Qt版本,4.4或者3.x的版本,并不提供LGPL协议,是不可逆的。同时未来发布的Qt版本,就⼀直会提供三种不同的授权协议版本。
下⾯有⼀些链接,有兴趣想深⼊了解这些授权协议的同学,可以学习学习

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。