原文地址:http://blog.51cto.com/devbean/313477


  最近一直在学习 Qt。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库的代码,那么必须把这个类开源。例如,如果你的程序 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,最终重新链接。一个新的可执行程序诞生啦!

  好了,这就是在使用 LGPL库开发闭源程序所需要遵守的东西了。还是建议大家能够遵守协议,尊重作者的劳动成果哦~

  附件中是 LGPL协议的文本文件。

Qt的开源版本与商业版区别及LGPL与闭源程序相关推荐

  1. CRM系统免费版和商业版区别

    随着CRM系统市场的火热,CRM市场的竞争也是越来越激烈,市面上的打着免费CRM系统旗号的有很多,但真正全功能开发的CRM系统且免费使用的基本没有,一般功能都会有限制等等.那么接下来小编来为大家介绍下 ...

  2. QT的几种许可总结(GPL、LGPL、Commerical)

    Qt 有三个许可证:GPL.LGPL 和 Commercial(商业协议).         这几个协议在现在的 Qt 版本中的代码是完全一致的(Qt 的早期版本,商业版的 Qt 通常包含有一些开源版 ...

  3. 微擎公众版、授权版和商业版有什么区别?如何选择?

    微擎版本分为免费和收费两种,免费为公众版不可用于商业运营,授权版和商业版可用于商业运营,授权版相对于商业版会便宜一些为4999元,商业版8800元,功能方面会比授权版支持丰富,新手站长来详细说下微擎免 ...

  4. 干货丨开源软件的商业路径

    以下文章来源于开源中国 ,作者谢佳 本文为BlockMania「走进开源世界」系列第二篇文章. 点击回顾第一篇:开源背后有怎样的经济学原理? 2018年是开源软件史上意义非凡的一年,这一年在开源软件与 ...

  5. qt商业版和开源版的区别_微擎商业版系统V2.0.9全开源版纯净框架

    微擎商业版系统V2.0.9全开源版纯净框架_全新界面无后门无任何限制.该源码不含任何安装模块,最重要的是该版本是一键安装版,主要你上传到服务器上,然后直接运行域名就会直接进入安装环境,不会像网络上的其 ...

  6. Flowable商业版本和开源版本功能区别

    本文章关注Flowable商业版本与Flowable开源版本功能区别.由于商业版本的版权问题,本文只罗列的Flowable商业版本功能仅限于Flowable商业版本中 盘古BPM获取到的授权功能. 由 ...

  7. JEECG 商业版本和开源版本有什么区别呢?

    好纠结啊,JEECG 商业版本和开源版本有什么区别呢? 小J博士来给你解答: 商业版本独有功能: 1.流程设计器 2.集成工作流引擎activit,智能化封装,在线配置表单,在线设计流程,流程和表单挂 ...

  8. 好纠结啊,JeeWx商业版本和开源版本有什么区别呢?

    好纠结啊,JeeWx商业版本和开源版本有什么区别呢? JeeWx开源版本是一套基础微信开发平台,有基础的微信菜单.素材管理.微信对接等基础功能,适合于开发者学习研究. JeeWx商业版本是一套成熟的微 ...

  9. Qt商业版和开源版下载地址!!!!!!

    Qt被Digia收购后,qt.nokia都指向了http://qt.digia.com,默认下载的是qt的商业版,30天免费使用,但需要注册. 在商业版下载页http://qt.digia.com/T ...

最新文章

  1. #linux进阶#归档压缩
  2. boost::hana::test::TestSearchable用法的测试程序
  3. VTK嵌入MFC同步显示
  4. Ubuntu 16.04下面安装grub-customizer来切换ubuntu+win7双系统开机启动顺序
  5. sql 列转行_SQL面试题:如何行列互换?一个万能模板
  6. Zookeeper分布式安装部署
  7. c语言2的1000次方,在网上看到一个求2的10000次方的方法,有个地方看不懂,求大佬...
  8. ATT拟854亿美元收购时代华纳 国内运营商坐不住了
  9. alter table *** add constraint *** 用法---约束
  10. 可视化概念思维导图软件 MindMapper 17 Arena 完美汉化开心版
  11. 关于键盘(总论8042)
  12. 修改html文字大小,css如何调整字体大小?
  13. NMOS 与 PMOS
  14. c语言编程坦克图案,用C语言的图像函数画一个简单的坦克图样
  15. 2017年18岁的北京文科状元父母都是外交官,关于高考,他说出了我们竭力回避的戳心真相
  16. php删除二维数组元素_php怎样删除二维数组中的元素
  17. 【前端基础】12.CSS 基础知识学习——基本语法结构
  18. 高性能处理器架构与编程实验(基础实验2:openEuler系统环境实验)
  19. strongbox-数论
  20. 安卓笔记:修正Task ‘wrapper‘ not found in project

热门文章

  1. FireStream for Mac(搭建UPnP/DLNA媒体服务器)
  2. STM32CubeMX与HAL库学习--简单的CAN回环测试
  3. 计算机组装与维护实习内容有那些,计算机组装与维护实习报告讲述.doc
  4. 【数字识别】基于模板匹配实现OCR印刷字母+数字识别含Matlab源码
  5. HPC帮助工程师在大约两小时内模拟飞机的起飞
  6. 最新《四脚猫高级PHP培训课程》
  7. java生成多级目录
  8. Octave的一些基本操作和语法,快速上手Octave,用实例解释
  9. 快用Python(Pygame)代码燃放起你专属的烟花吧,咝......咻——嘭~
  10. 统计:抓虾热文的都是那些网站贡献的?