一张图看清五种软件许可协议的限制

为了更好理解这几种协议,应用了如下几篇博客,出处在下面: php

关于Qt的三种协议以及是否收费,有如下引文:html

引文一:
linux

    最近一直在学习 Qt。Qt 有两个许可证:LGPL 和商业协议。这两个协议在如今的 Qt 版本中的代码是彻底一致的(潜在含义是,Qt 的早期版本,商业版的 Qt 一般包含有一些开源版本所没有的库,好比 QtSingleApplication 这个库)。因此如今对于普通开发人员和部分商业公司来讲,使用 LGPL 版本的 Qt 能够节省很大的开销。这两个版本最大的区别在于,前者是免费的,后者是收费的。既然代码都是一致的,因此费用就要是用来购买 Qt 的售后服务和培训等等相关服务。程序员

    如今咱们是来讲一下版权的问题。LGPL 是一个开源协议,所以,有人会担忧 LGPL 可否用于开发闭源程序,可以拿来卖钱。尽管如今国内有些公司不是很重视这方面的问题,不过,若是你违反了协议,某一天被别人发来一纸律师函的时候,真的是欲哭无泪了哦。因此,咱们仍是先来研究一下这个协议,LGPL 究竟能不能用于开发闭源程序。编程

    如下内容是我查找了 N 多网站总结出来的,由于豆子不是律师,因此 LGPL 协议基本看不懂。究竟怎样去理解这个协议,仍是但愿可以有专业人士说出来。这里就算作是一种抛砖引玉吧!尽管没有十分的肯定,可是这里所说的理解基本也是八九不离十的了。并发

    至于什么是 LGPL 协议,这里就再也不多说了,咱们关心的是,若是使用 LGPL 协议开发商业程序。请注意,这里所说的闭源程序,是指不以某种形式开放源代码,也就是说,用户(包括其余开发者)不能获取其源代码的程序。首先说明一点,LGPL协议是一个商业友好的协议。这里的含义是,你能够用 LGPL协议开发商业程序,固然也能够是非商业的闭源程序。可是,它是有一些限制的。这就是咱们要讨论的重点。app

    既然咱们已经对其定性,那么咱们直接进入主题:使用 LGPL 协议开发闭源程序,若是你使用动态连接的形式,那么,你能够以任何形式发布你的应用程序,商业的、非商业的、开源的、非开源的,随你。若是你因某种缘由必须静态连接一个基于 LGPL 协议发布的库(一下咱们简称为 LGPL 库),那么,你有义务进行下面的工做:
less

1.你必须在你的文档中说明,你的程序中使用了 LGPL 库,而且说明这个库是基于 LGPL 发布的;
2.你必须在你的应用程序发布中包含一份 LGPL协议,一般就是那个文本文件;
3.你必须开放使用了 LGPL 库代码的全部代码,例如某些封装器。可是,其余使用这些封装器的代码就不须要开放了;
4.你必须包含你的应用程序的余下部分的目标文件(一般就是咱们所说的 .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 下)这个目标文件。

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

1.一份文档,其中声明:这个程序使用了 Lib库,这个库是基于 LGPL 协议发布的;

2.LGPL.txt;

3.lib_wrapper.cpp;

4.main.o

这样,用户能够经过修改 lib_wrapper.cpp  的内容改变你使用 LGPL 库的方式,例如:

void my_lib_done() 

{     

    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版本,就一直会提供三种不一样的受权协议版本。

    下面有一些连接,有兴趣想深刻了解这些受权协议的同窗,能够学习学习

GPL协议原文 - http://www.gnu.org/copyleft/gpl.html
GPL协议中文译文 - http://bergwolf.googlepages.com/gplv3_zh
LGPL协议原文 - http://www.gnu.org/copyleft/lesser.html
LGPL协议中文译文 - http://www.thebigfly.com/gnu/lgpl/lgpl-v3.php
58种不一样的开源协议 - http://www.fsf.org/licensing/licenses/
什么是动态连接 -http://zh.wikipedia.org/wiki/%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93
官方声明 - http://www.qtsoftware.com/about/news/lgpl-license-option-added-to-qt
官方Q&A - http://www.qtsoftware.com/about/licensing/frequently-asked-questions


-------------------------------------------------------------------------------------------------------------------------------------------

GPL

GPL授予程序接受人如下权利,或称“自由”:

* 以任何目的运行此程序的自由

* 以学习程序工做机理为目的,对程序进行修改的自由(能获得源代码是前提)

* 再发行复制件的自由

* 改进此程序,并公开发布改进的自由(能获得源代码是前提)

相反地,随版权全部软件的最终用户许可证几乎从不授予用户任何权利(除了使用的权利),甚至可能限制法律容许的行为,好比逆向工程。

GPL与其余一些更“许可的”自由软件许可证(好比BSD许可证)相比,主要区别就在于GPL寻求确保上述自由能在复制件及演绎做品中获得保障。它经过一种由Stallman发明的叫copyleft的法律机制实现,即要求GPL程序的演绎做品也要在GPL之下。相反,BSD式的许可证并不由止演绎做品变成版权全部软件。

copyleft

GPL不会授予许可证接受人无限的权利。再发行权的授予须要许可证接受人开放软件的源代码,及全部修改。且复制件、修改版本,都必须以GPL为许可证。

这些要求就是copyleft,它的基础就是做品在法律上版权全部。因为它版权全部,许可证接受人就无权进行修改和再发行(除合理使用),除非它有一个copyleft条款。若是某人想行使一般被法律所禁止的权利,只需赞成GPL的条款。相反地,若是某人发行软件违反了GPL(好比不开放源代码),他就有可能被原做者起诉。

copyleft利用版权法来达到与其相反的目的:copyleft给人不可剥夺的权利,而不是版权法所规定的诸多限制。这也是GPL被称做“被黑的版权法”的缘由。

许多GPL软件发行者都把源代码与可执行程序捆绑起来。另外一方式就是以物理介质(好比CD)为载体提供源代码。在实践中,许多GPL软件都是在互联网上发行的,源代码也有许多能够FTP方式获得。

copyleft只在程序再发行时发生效力。对软件的修改能够不公开或开放源代码,只要不发行。注意copyleft只对软件有效力,而对软件的输出并没有效力(除非输出的是软件自己)。不过这在GPL版本3中可能会有改动。

LGPL

GNU宽通用公共许可证,简称LGPL(GNU Lesser General Public License),被用于一些(但不是所有)GNU程序库。这个许可证之前被称为GNU库(Library)通用公共许可证。

LGPL是GPL的变种,也是GNU为了获得更多的甚至是商用软件开发商的支持而提出的。与GPL的最大不一样是,能够私有使用LGPL受权的自由软件,开发出来的新软件能够是私有的而不须要是自由软件。因此任何公司在使用自由软件以前应该保证在LGPL或其它GPL变种的受权下。

Apache License

Apache License是著名的非盈利开源组织Apache采用的协议。该协议和BSD相似,一样鼓励代码共享和尊重原做者的著做权,一样容许代码修改,再发布(做为开源或商业软件)。须要知足的条件:

* 须要给代码的用户一份Apache License

* 若是你修改了代码,须要再被修改的文件中说明

* 在延伸的代码中(修改和有源代码衍生的代码中)须要带有原来代码中的协议、商标、专利声明和其余原来做者规定须要包含的说明

* 若是再发布的产品中包含一个Notice文件,则在Notice文件中须要带有Apache License。你能够在Notice中增长本身的许可,但不能够表现为对Apache License构成更改

Apache License也是对商业应用友好的许可。使用者也能够在须要的时候修改代码来知足须要并做为开源或商业产品发布/销售。

BSD

BSD受权许可证(FreeBSD Copyright Information)具备多种受权许可证。总的来讲你能够对软件任意处理,只要你在软件中注明其是来自于那个项目的就能够了。也就是说你具备更大的自由度来处置软件。若是你对软件进行了修改,你能够限制其余使用者获得你修改的软件的自由。

BSD受权许可证没有实现"通透性"自由,也就是其不保证软件源代码开放的连续性。这样若是你但愿采用别人开发的BSD软件,进行一些修改,而后做为产品卖,或者仅仅保密本身的作的一些除了软件开发之外的工做,那么你就能够从中得利。

当一个非程序员仅仅理解一个程序的功能,可是不了解程序是如何作的时,即便你没有在开发软件中作任何工做那你就能够经过高超的市场技巧将软件卖给该用户。好比拿最流行的桌面操做系统做为例子,你就能很好的理解一个没有很好的程序技巧的软件公司只要具备高超的市场营销策略一样能够将垃圾卖给客户。若是你不具备很强大的编程能力,可是具备很强的市场能力和能将其余开发者的软件包括到本身的系统,而同时不将本身的修改开放出来将是很是强大的能力。从赚钱为目的的商务角度看来,若是你使用了BSD受权许可证的软件,那么你就能够任意进行。你能够更好地控制你的OS系统,而且防止其余人拷贝你的商业产品。

总结一下

简单的说,就是你使用了GPL许可证的软件,那么你的软件产品就被GPL“传染”了,也必须“自由”!这对国内的商业软件开发商来讲是很难接受的。

可是LGPL, Apache License, BSD就不存在这个问题,后二者只要求你对软件原做者的工做进行必要的承认和尊重就好了,因此这是适合商业应用的。

因此在选择应用开源软件时,必定要明白本身的用途,选择合适许可证下的软件。

最后,咱们能够参考一下对GPL的评论:

2001年微软的首席执行官Steve Ballmer称Linux为“癌症”,由于GPL的影响。微软的批评指出,微软憎恶GPL的真正缘由是由于对微软的“包围、扩展、消灭”策略起了副作用。注意微软已以GPL为许可证发行了SFU(Microsoft Windows Services for UNIX)中所包含的部分组件,例如GCC。

GPL的批评者经常认为GPL是有“传染性”的“病毒”,由于GPL条款规定演绎做品也必须是GPL的。因为“演绎做品”一般被解释为包含GPL代码或动态连接到GPL库(如上)的软件,“病毒说”来源于GPL对于许可证的强制继承的要求。这正是GPL与BSD式许可证的哲学思想上的差别。GPL的支持者确信自由软件应确保其演绎做品一样“自由”,但其余人认为自由软件应给用户最大的自由。