LGPL协议的理解
Loaden : http://bbs.csdn.net/topics/330104257
http://devbean.blog.51cto.com/448512/313477
最近一直在學習Qt。Qt有兩個許可證:LGPL和商業(yè)協(xié)議。這兩個協(xié)議在現在的Qt版本中的代碼是完全一致的(潛在含義是,Qt的早期版
本,商業(yè)版的Qt通常包含有一些開源版本所沒有的庫,比如QtSingleApplication這個庫)。所以現在對于普通開發(fā)人員和部分商業(yè)
公司來說,使用LGPL版本的Qt可以節(jié)省很大的開銷。這兩個版本最大的區(qū)別在于,前者是免費的,后者是收費的。既然代碼都是一致的,所以費用就
要是用來購買Qt的售后服務和培訓等等相關服務。
現在我們是來說一下版權的問題。LGPL是一個開源協(xié)議,因此,有人會擔心LGPL能否用于開發(fā)閉源程序,能夠拿來賣錢。盡管現在國內有些公司不是
很重視這方面的問題,不過,如果你違反了協(xié)議,某一天被別人發(fā)來一紙律師函的時候,真的是欲哭無淚了哦。所以,我們還是先來研究一下這個協(xié)
議,LGPL究竟能不能用于開發(fā)閉源程序。
以下內容是我查找了N多網站總結出來的,因為豆子不是律師,所以LGPL協(xié)議基本看不懂。究竟怎樣去理解這個協(xié)議,還是希望能夠有專業(yè)人士說出來。這里就算做是一種拋磚引玉吧!盡管沒有十分的確定,但是這里所說的理解基本也是八九不離十的了。
至于什么是LGPL協(xié)議,這里就不再多說了,我們關心的是,如果使用LGPL協(xié)議開發(fā)商業(yè)程序。請注意,這里所說的閉源程序,是指不以某種形式開
放源代碼,也就是說,用戶(包括其他開發(fā)者)不能獲取其源代碼的程序。首先說明一點,LGPL協(xié)議是一個商業(yè)友好的協(xié)議。這里的含義是,你可以
用LGPL協(xié)議開發(fā)商業(yè)程序,當然也可以是非商業(yè)的閉源程序。但是,它是有一些限制的。這就是我們要討論的重點。
既然我們已經對其定性,那么我們直接進入主題:使用LGPL協(xié)議開發(fā)閉源程序,如果你使用動態(tài)鏈接的形式,那么,你可以以任何形式發(fā)布你的應用程序,商業(yè)的、非商業(yè)的、開源的、非開源的,隨你。
如果你因某種原因必須靜態(tài)鏈接一個基于LGPL協(xié)議發(fā)布的庫(一下我們簡稱為LGPL庫),那么,你有義務進行下面的工作:
1.你必須在你的文檔中說明,你的程序中使用了LGPL庫,并且說明這個庫是基于LGPL發(fā)布的;
2.你必須在你的應用程序發(fā)布中包含一份LGPL協(xié)議,通常就是那個文本文件;
3.你必須開放使用了LGPL庫代碼的所有代碼,例如某些封裝器。但是,其他使用這些封裝器的代碼就不需要開放了;
4.你必須包含你的應用程序的余下部分的目標文件(通常就是我們所說的.o等等),或者是其他等價的文件。源代碼并不是必須的。
是不是很難理解呢?我們詳細的說一下。
第一條很容易理解;第二條也很容易理解,你可以在這里找到LGPL協(xié)議的內容,復制下來隨你的程序一起發(fā)布就可以了。第三條就不那么好理解了。簡單來
說,LGPL協(xié)議要求,如果你的類使用了LGPL庫的代碼,那么必須把這個類開源。例如,如果你的程序app.exe每個源文件都使用
了LGPL庫的代碼,那么你的所有源代碼都要開源。為了避免這種情況,我們通常編寫一個封裝器,把LGPL庫的代碼封裝起來,這樣就只需要開放這個
封裝器的代碼,而其他使用了這個封裝器的代碼就不需要開放。第四條是對第三條的一種補充:那些使用了封裝器的程序不需要開源,但是你必須把你編譯的那些中
間文件開放出來,Windows下就是那些.o文件。
你很奇怪,為什么LGPL協(xié)議要這樣規(guī)定呢?LGPL所做的工作是,它保證了用戶能夠有這樣一種能力:修改你使用LGPL庫函數的方式(那些封裝
器就是你使用LGPL庫的方式,那些已經開源了),重新編譯這些代碼,然后重新對程序進行連接(連接所需要的目標文件也是包含了的,這是第四條規(guī)定
的),就可以得到一個新的可執(zhí)行程序。
好了,如果你還不明白如何使用,我們來看一個例子。
假設我們使用一個名為Lib的庫,這個庫是基于LGPL協(xié)議發(fā)布的。如果你使用Lib.dll做動態(tài)鏈接(Windows下),好,一切OK。無論你的程序怎么樣,你都可以做你所做的事情。
我們主要是來看,如果你要使用靜態(tài)鏈接,那么你需要如何組織你的代碼。如果你有一個main.cpp(我們假設所有Lib庫的函數都是用了lib_前綴):
1.//main.cpp
2.intmain(){
3.lib_init();
4.lib_do_something();
5.lib_done();
6.lib_close();
7.
8.return0;
9.}
現在你已經完成了main.cpp,但是你必須把它開源!因為它使用了LGPL庫的代碼。這是上面第三條規(guī)定的。我不想把它開源,怎么辦呢?好,我們建一個新的文件lib_wrapper.cpp:
1.voidmy_lib_init()
2.{
3.lib_init();
4.}
5.
6.voidmy_lib_do_something()
7.{
8.lib_do_something();
9.}
10.
11.voidmy_lib_done()
12.{
13.lib_done();
14.}
15.
16.voidmy_lib_close()
17.{
18.lib_close();
19.}
在main.cpp中,我們做相應的修改:
1.intmain(){
2.my_lib_init();
3.my_lib_do_something();
4.my_lib_done();
5.my_lib_close();
6.
7.return0;
8.}
現在,main.cpp不再是直接使用了LGPL庫的代碼了,因此它不需要開源,而我們的封裝器lib_wrapper.cpp必須開源。
好,編譯一下我們的程序,你會得到main.o(Windows下)這個目標文件。
在最終程序的發(fā)布中,你需要包含一下文件:
1.一份文檔,其中聲明:這個程序使用了Lib庫,這個庫是基于LGPL協(xié)議發(fā)布的;
2.LGPL.txt;
3.lib_wrapper.cpp
4.main.o
這樣,用戶可以通過修改lib_wrapper.cpp的內容改變你使用LGPL庫的方式,例如:
1.voidmy_lib_done()
2.{
3.lib_done();
4.lib_close();
5.}
6.
7.voidmy_lib_close()
8.{
9.//lib_close();
10.}
然后編譯這個lib_wrapper.cpp,最終重新鏈接。一個新的可執(zhí)行程序誕生啦!
好了,這就是在使用LGPL庫開發(fā)閉源程序所需要遵守的東西了。還是建議大家能夠遵守協(xié)議,尊重作者的勞動成果哦~
附件中是LGPL協(xié)議的文本文件。
總結
- 上一篇: 私钥、秘钥详解
- 下一篇: STM32 之 NVIC(中断向量、优先