http://www.devbean.net/2011/12/lgpl-explain/
Qt 有两个许可证:LGPL 和商业协议。这两个协议在现在的 Qt 版本中的代码是完全一致的(潜在含义是,Qt 的早期版本,商业版的 Qt 通常包含有一些开源版本所没有的库,比如 QtSingleApplication 这个库)。所以现在对于普通开发人员和部分商业公司来说,使用 LGPL 版本的 Qt 可以节省很大的开销。这两个版本最大的区别在于,前者是免费的,后者是收费的。既然代码都是一致的,所以费用就要是用来购买 Qt 的售后服务和培训等等相关服务。
现在我们是来说一下版权的问题。LGPL 是一个开源协议,因此,有人会担心 LGPL 能否用于开发闭源程序,能够拿来卖钱。尽管现在国内有些公司不是很重视这方面的问题,不过,如果你违反了协议,某一天被别人发来一纸律师函的时候,真的是欲哭无泪了哦。所以,我们还是先来研究一下这个协议,LGPL 究竟能不能用于开发闭源程序。
至于什么是 LGPL 协议,这里就不再多说了,我们关心的是,如果使用 LGPL 协议开发商业程序。请注意,这里所说的闭源程序,是指不以某种形式开放源代码,也就是说,用户(包括其他开发者)不能获取其源代码的程序。首先说明一点,LGPL协议是一个商业友好的协议。这里的含义是,你可以用 LGPL协议开发商业程序,当然也可以是非商业的闭源程序。但是,它是有一些限制的。这就是我们要讨论的重点。
既然我们已经对其定性,那么我们直接进入主题:使用 LGPL 协议开发闭源程序,如果你使用动态链接的形式,那么,你可以以任何形式(商业的、非商业的、开源的、非开源的等等)发布你的应用程序。
如果你因某种原因必须静态链接一个基于 LGPL 协议发布的库(一下我们简称为 LGPL 库),那么,你有义务进行下面的工作:
- 你必须在你的文档中说明,你的程序中使用了 LGPL 库,并且说明这个库是基于 LGPL 发布的;
- 你必须在你的应用程序发布中包含一份 LGPL协议,通常就是那个文本文件;
- 你必须开放使用了 LGPL 库代码的所有代码,例如某些封装器。但是,其他使用这些封装器的代码就不需要开放了;
- 你必须包含你的应用程序的余下部分的目标文件(通常就是我们所说的 .o 等等),或者是其他等价的文件。源代码并不是必须的。
是不是很难理解呢?我们来详细说明一下。
第一条很容易理解;第二条也很容易理解,你可以在这里找到 LGPL 协议的内容,复制下来随你的程序一起发布就可以了。第三条就不那么好理解了。简单来说,LGPL协议要求,如果你的类使用了LGPL库的代码,那么必须把 这个类开源。例如,如果你的程序 app.exe 每个源文件都使用了 LGPL 库的代码,那么你的所有源代码都要开源。为了避免这种情况,我们通常编写一个封装器,把 LGPL库的代码封装起来,这样就只需要开放这个封装器的代码,而其他使用了这个封装器的代码就不需要开放。第四条是对第三条的一种补充:那些使用了封装 器的程序不需要开源,但是你必须把你编译的那些中间文件开放出来,比如 gcc 编译器的那些 .o 文件。
为什么 LGPL协议要这样规定呢?原来,LGPL 所做的工作是,它保证了库的使用者能够有这样一种能力:修改你使用 LGPL 库函数的方式(那些封装器就是你使用 LGPL库的方式,现在已经开源了),重新编译这些代码,然后重新对程序进行连接(连接所需要的目标文件也是包含了的,这是第四条规定的),就可以得到一 个新的可执行程序。
如果你还不明白如何使用,我们来看一个例子。
假设我们使用一个名为 LibA 的库,这个库是基于 LGPL 协议发布的。如果你使用 LibA.dll 做动态链接(Windows 下),那么,无论你的程序如何发布,你都可以做你想做的事情。
如果你要使用静态链接(并且,你也不想开源),那么你需要按照一定的规范组织你的代码。
假设你有一个 main.cpp(我们假设所有 LibA 库的函数都是用了 libA_ 前缀):
1
2
3
4
5
6
7
8
9
10
|
// main.cpp
int main()
{
libA_init();
libA_do_something();
libA_done();
libA_close();
return 0;
}
|
现在你已经完成了 main.cpp,但是你必须把它开源!因为它使用了 LGPL 库的代码。这是上面第三条规定的。我不想把它开源,怎么办呢?好,我们建一个新的文件 libA_wrapper.cpp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
void my_libA_init()
{
libA_init();
}
void my_libA_do_something()
{
libA_do_something();
}
void my_libA_done()
{
libA_done();
}
void my_libA_close()
{
libA_close();
}
|
在 main.cpp 中,我们做相应的修改:
1
2
3
4
5
6
7
8
9
|
int main()
{
my_libA_init();
my_libA_do_something();
my_libA_done();
my_libA_close();
return 0;
}
|
现在,main.cpp 不再是直接使用了 LGPL 库的代码了,因此它不需要开源,而我们的封装器 lib_wrapper.cpp 必须开源。
现在编译一下我们的程序,你会得到 main.o(gcc 编译器)这个目标文件。
在最终程序的发布中,你需要包含以下文件:
- 一份文档,其中声明:本程序使用了 LibA 库,这个库是基于 LGPL 协议发布的;
- LGPL.txt;
- libA_wrapper.cpp
- main.o
这样,用户可以通过修改 libA_wrapper.cpp 的内容改变你使用 LGPL 库的方式,例如:
1
2
3
4
5
6
7
8
9
10
|
void my_libA_done()
{
libA_done();
libA_close();
}
void my_libA_close()
{
// libA_close();
}
|
然后编译这个 libA_wrapper.cpp,最终重新链接。一个新的可执行程序诞生啦!
好了,这就是在使用 LGPL库开发闭源程序所需要遵守的东西了。还是建议大家能够遵守协议,尊重作者的劳动成果哦~
http://blog.csdn.net/flowingflying/article/details/5386069
除了GPL和LGPL外,还有BSD和MPL,但是在Linux中GPL和LGPL是最主流的两种。GPL和LGPL都是公众的License,用于主要限定了使用者,以及在上面进行二次开发的开发者权限,即他的权力和义务,而不是去宣称提供者的利益。
简单地说:GPL是带有病毒传播性的,你包含了GPL的东西,无论是否修改,你也必须是GPL,LGPL则是你修改了LGPL的内容,你也必须是LGPL。
GPL(GUN通用公共许可证)
- 保护对象是应用程序 : 例如Kernel, butil tools, gcc,gdb 。
- 为开发者与用户提供较高的自由度 ,让他们能够在几乎没有限制的情况下使用/修改/发布软件。
- 只要不更改许可证和版权声明,可随意复制程序。
- GPL对软件提供的许可不包含任何担保,除非该担保是由发行者提供的。为别人提供复制品及担保服务时,可以收取费用。(GPL和LGPL鼓励软件自由分发,但不代表GPL/LGPL软件必须免费,像redhat linux enterprise就是收费软件,只是付费用户拿到软件后还可以再向其他人免费分发,因此GPL/LGPL软件的厂家大多只能收取软件增值服务费)
- 发行程序的二进制副本时,必须随附源码,通常指“本来的”源码。
- 只要修改或者包含受GPL保护的程序或者程序的任何一部分,需遵照GPL的规定,否则不能对外发行。
- 将未经修改的软件包装起来,则不在上面的限制。
- 对于执行GPL软件: 无须担心GPL,例如使用gcc编译器
- 对于 在原有软件基础上建立衍生作品
- 需遵循GPL规定
- 无论采用静态还是动态链接方式,私有应用在执行期间通过动态链接整合了GPL软件,仍将受到GPL制约
- GPL软件的协议扩散范围仅限于进程空间内,跨进程使用GPL软件不受GPL约束
- 对于专利问题: 任何专利必须以允许每个人自由使用为前提,否则就不准许有专利。 如果你重新发布 GPL 软件,你就明文授权了接受方使用此 GPL 软件中包含的你所拥有的专利。
LGPL (更为宽松的GPL,即Lesser GPL)
- 保护对象是链接库: 例如Glibc, GTK widget toolkit 。
- 对于 在原有软件基础上建立衍生作品
- 在程序中使用部分未经修改的LGPL程序,无须考虑LGPL的限制
- 对于修改的LGPL,必须遵照LGPL规定,否则不能对外发行
- 通过动态或者动态方式连接受到LGPL包括的库是,不受限制,可使用任何许可证发行软件。对于LGPL软件的代替问题,如果静态链接方式,必须给取用软件的人提供应用程序在链接之前的目标码。使用LGPL库,如果导入库的源代码一起编译,即使没修改库代码也要开源,如果采用静态链接(include了库的头文件),不需要发布源代码,但要发布.o(obj)文件,如采用动态链接,就可以完全封闭。
- 专利问题
- 一个函数库所能取 得的任何专利,必须与本许可证所声明的“完全自由使用”一致。
MPL(The Mozilla Public License)
- 一些重要条款
- 经MPL许可证发布的源代码的修改也要以MPL许可证的方式再许可出来
- “发布”的定义是“以源代码方式发布的文件”,这就意味着MPL允许一个企业在自己已有的源代码库上加一个接口,除了接口程序的源代码以MPL 许可证的形式对外许可外,源代码库中的源代码就可以不用MPL许可证的方式强制对外许可。
- 允许被许可人将经过MPL许可证获得的源代码同自己其他类型的代码混合得到自己的软件程序
- 专利
- 源代码的提供者不能提供已经受专利保护的源代码(除非他本人是 专利权人,并书面向公众免费许可这些源代码),也不能在将这些源代码以开放源代码许可证形式许可后再去申请与这些源代码有关的专利。
这些许可证,在美国是有法律保护,在中国如果违反,不清楚是否有问题,因为不清楚这些许可证在中国是否具有法律效应。国内的知识产权法律在开源协议保护方面似乎比较欠缺,国内有很多违反开源协议的企业,但没有哪些受到法律制裁。据说只有开源软件的作者亲自去告违反开源协议的企业才有胜诉的可能。 但是从开发者的角度看,GPL和LGPL反对通过专利收费的方式来进行技术的垄断或者霸占,他们提供了公开开放的方式,也要求他们的使用者遵循这个原则。这是网络的共产主义条款,我们应遵循他们,去年green坝在这方面不太厚道,网上有不少研究评论,不凑这个热闹了。