我們在開發過程中,如果引用到了開源庫,一定一定要小心,尤其是在大公司工作時的產品開發,一定要明白開源庫的來源,以及許可證的限制;不然可能會導致公司巨大的法律風險,目前在軟件開發中最常見的許可證有如下幾種:
(詳細情況可以查看網站:[https://opensource.org/licenses)](https://opensource.org/licenses%EF%BC%89)
###
## **BSD (Berkerley Software Distribution)**
BSD許可證給予用戶在使用開源代碼方面很大的自由,分為2-Clause(兩條款)和3-Clause(三條款)兩類,需要遵守以下規則:
1. 如果分發的軟件包含源代碼,則必須在源代碼中保留原始的BSD許可證聲明。
2. 如果分發的軟件僅包含二進制程序,則必須在文檔或版權說明中保留原始的BSD許可證聲明。
3. 未經許可,不得使用原始作者或機構的名字為軟件做市場推廣。(僅3-Clause需要遵守)
###
## **Apache-2.0**
Apache Licence是著名的非盈利開源組織Apache采用的協議,需要遵守以下規則:
1. 必須在源代碼中保留原始的Apache許可證聲明。
2. 如果用戶修改了源代碼,需要在被修改的文件中說明。
3. 在衍生產品中,必須保留原來代碼中的版權、專利、商標及作者規定的其他需要包含的說明等信息。
4. 如果在分發的軟件中包含Notice文件,則需要在Notice文件中包含Apache許可證聲明。
###
**MIT (Massachusetts Institute of Technology)**
和BSD-2-Clause類似,即需要遵守以下規則:
1. 如果分發的軟件包含源代碼,則必須在源代碼中保留原始的MIT許可證聲明。
2. 如果分發的軟件僅包含二進制程序,則必須在文檔或版權說明中保留原始的MIT許可證聲明。
###
## **No License**
隨便用,隨便改,怎么都行。
###
## **GPL 2.0**
只要軟件中引用及修改了GPL代碼或者鏈接了GPL類庫,整個軟件就就必須遵循GPL,不僅需要公開所有源碼,并且允許他人可以自由地復制和分發。
###
## **GPL 3.0**
GPLv3包含了明確的專利許可以及添加了對數字版權管理和加密簽名的限制,不僅要求用戶公開源碼,還要求公布相關硬件及必要的安裝信息。
GPLv3能與更多的許可證兼容,例如Apache 2.0,但這個兼容是單向的,即GPLv3許可證的項目中可以包含Apache 2.0的開源代碼,但是Apache許可證的項目不能包含GPLv3的開源代碼。值得注意的是,GPLv3與GPLv2卻并不兼容,即一個項目中不能同時包含GPLv2和GPLv3的代碼,但是,如果軟件以GPL “v2或更高版本”許可證發布,則與GPLv3兼容。
###
## **AGPL**
AGPL是對GPL的補充,如果使用了AGPL代碼的軟件是一個網絡應用,那么這個軟件的所有源碼和修改代碼也必須開源,除非購買了該AGPL代碼的商業授權。
###
## **LGPL**
和GPL相比,LGPL限制更少,是一個主要為類庫使用設計的開源協議,需要遵守以下規則:
1. 如果軟件通過動態鏈接的方式使用LGPL類庫,則該軟件不需要開源。
2. 如果軟件通過靜態鏈接的方式使用LGPL類庫,則軟件作者必須提供程序的二進制目標文件(不需要提供源代碼),以便用戶有機會更新LGPL類庫并重新鏈接到該程序。
3. 如果修改了LGPL的源碼或者衍生了新的代碼,則所有修改后及衍生的代碼也必須遵循LGPL許可證。
###
## **MPL (Mozilla Public License)**
MPL License由Mozilla基金會開發并維護,介于BSD(衍生代碼可以閉源)和GPL(衍生代碼必須以GPL方式開源)之間,最新發布的2.0版以更簡潔和更好的兼容其他協議為目標,鼓勵企業和開源社區為開發核心軟件做更多貢獻。使用MPL源碼需要遵守以下規則:
1. 如果修改了MPL的源碼或者衍生了新的代碼,并且以源代碼方式發布的文件,則所有修改后及衍生的代碼也必須遵循MPL許可證。
2. 如果用戶自有的源碼通過專用接口訪問MPL的源碼及類庫,則包含專用接口的代碼必須遵循MPL許可證,用戶自有源碼不必遵循MPL許可證。
3. 用戶獲得MPL代碼中的專利許可,但是不能使用其原始商標。
###
## **EPL (Eclipse Public License)**
EPL License由Eclipse基金會開發并維護,在CPL基礎上刪除了專利相關訴訟的限制條款。EPL比GPL許可證更為寬松,并且與GPL并不兼容。使用EPL源碼需要遵守以下規則:
1. 如果修改了EPL的源碼或者衍生了新的代碼,并且以源代碼方式分發,則所有修改后及衍生的代碼也必須遵循EPL許可證。
2. 如果軟件以二進制目標文件的形式分發,則需要聲明可以根據請求向其他用戶提供源代碼。
3. 用戶獲得EPL代碼中的專利許可。
###
## **Permissive許可證**
Permissive License(寬松式許可證)允許用戶不經許可可以隨意復制、修改和發布,但是并不要求分發時必須使用相同的許可證,用戶可以在修改代碼后選擇閉源,常見的Apache、BSD、MIT屬于Permissive許可證。
###
## **Copyleft許可證**
Copyright(版權) 的意思是未經許可,用戶無權復制和使用。Copyleft License(反版權許可證) 作為Copyright的反義詞,意為未經許可,用戶也可以隨意復制、修改和發布,但要求分發者必須使用相同的許可證發布修改后的衍生作品,以保證衍生作品也能被其他人自由使用,常見的AGPL, GPL, LGPL, MPL屬于Copyleft許可證。
###
以下是一張幫助理解的大致圖片,具體請登錄到本章開頭的鏈接中進行了解。
:-:

- 《嵌入式Linux開發指南——面向IoT領域》
- 源代碼與開發軟件
- 配套開發套件
- 前言
- 起始部分:準備篇
- 硬件開發平臺簡介
- 安裝 Xshell 7 調試工具
- 安裝必要的驅動
- 配置安裝ADB
- 配置安裝cmder
- 第一部分:基礎篇
- 第1章 開發環境及交叉編譯鏈的搭建
- 本章學習目標
- 1.1 開發服務器的搭建
- 1.1.1 VMware導入開發服務器
- 1.1.2 Samba網絡服務
- 1.1.3 SSH網絡服務
- 1.1.4 交叉編譯鏈
- 1.2 硬件資源介紹
- 第2章 Linux基本命令
- 2.1 常用命令
- 2.1.1 ls
- 2.1.2 cd
- 2.1.3 pwd
- 2.1.4 mkdir
- 2.1.5 touch
- 2.1.6 mv
- 2.1.7 cp
- 2.1.8 rm
- 2.1.9 file
- 2.1.10 cat
- 2.1.11 tree
- 2.1.12 find
- 2.1.13 clear
- 2.1.14 chmod
- 2.1.15 sudo
- 2.1.16 su
- 2.1.17 ping
- 2.2 補充命令
- 2.2.1 ln
- 2.2.2 grep
- 2.2.3 diff
- 2.2.4 patch
- 第3章 嵌入式C基礎
- 3.1 數據類型
- 3.1.1 類型定義
- 3.1.2 類型格式化
- 3.2 變量
- 3.2.1 可執行程序存儲區
- 3.2.2 動態類型
- 3.2.3 類型轉換
- 3.3 指針
- 3.3.1 指針與堆
- 3.3.2 多階指針
- 3.3.3 通用類型指針
- 3.4 主函數(main)參數列表
- 3.5 可變參數
- 3.5.1 基本用法
- 3.5.2 擴展用法之日志輸出
- 3.6 頭文件
- 3.6.1 兼容C++
- 3.6.2 日志功能實例
- 3.6.3 C++源文件測試
- 第4章 嵌入式Shell基礎
- 4.1 基本語法
- 4.1.1 第一個程序
- 4.1.2 日志輸出
- 4.1.3 變量
- 4.1.4 分支控制ifelse
- 4.1.5 for循環
- 4.1.6 while循環
- 4.1.7 case分支語句
- 4.1.8 循環控制
- 4.1.9 變量運算符
- 4.2 函數
- 4.2.1 基本格式及調用
- 4.2.2 函數參數
- 4.2.3 腳本傳參
- 第5章 嵌入式系統基礎
- 5.1 固件基本組成
- 5.1.1 硬件系統結構
- 5.1.2 分區
- 5.1.2 軟件結構
- 5.2 內核設備樹
- 5.2.1 結構
- 5.2.2 節點語法
- 5.2.3 屬性語法
- 第6章 嵌入式C++基礎
- 第二部分:系統篇
- 第1章 固件分區和燒錄
- 1.1 準備工作
- 1.1.1 硬件連接說明
- 1.1.2 配置燒錄工具
- 1.2 固件燒錄
- 1.2.1 固件說明
- 1.2.2 進行燒錄
- 1.3 簡化固件
- 第2章 系統交叉編譯
- 2.1 Uboot
- 2.2 Kernel
- 2.3 Rootfs
- 2.4 APPs
- 第3章 Uboot串口交互終端
- 3.1 硬件連接
- 3.2 波特率配置
- 3.3 調試
- 3.4 Driver Model(DM)模型
- 3.5 串口驅動程序及DTS
- 3.5.1 驅動程序
- 3.5.2 設備樹
- 第4章 Kernel串口2做交互終端
- 4.1 驅動源碼
- 4.2 內核設備樹
- 4.3 補丁更新
- 第5章 內核Config
- 5.1 menuconfig
- 5.2 選項類型
- 5.3 部分General setup實例
- 5.4 生效配置
- 第6章 U盤掛載
- 6.1 配置選項說明
- 6.2 應用
- 第7章 SD卡掛載
- 7.1 內核設備樹
- 7.2 應用
- 第8章 WiFi-STA工作模式
- 8.1 內核配置
- 8.2 內核設備樹
- 8.3 wpa_supplicant
- 8.3.1 基礎
- 8.3.2 應用測試
- 8.3.3 配置文件連接
- 第9章 WiFi-AP工作模式
- 9.1 hostapd
- 9.1.1 基礎
- 9.1.2 應用測試
- 第10章 RGB調色燈三路PWM驅動
- 10.1 硬件基礎
- 10.2 內核設備樹
- 10.3 應用
- 第11章 ADC按鍵驅動
- 11.1 硬件基礎
- 11.2 設備樹節點
- 11.3 應用
- 11.3.1 了解IIO子系統
- 11.3.2 按鍵測試
- 第12章 串口1與ZigBee主控鏈路
- 12.1 設備樹節點
- 12.2 應用測試
- 第13章 可讀寫根文件系統
- 13.1 簡述
- 13.2 內核配置樹修改
- 第14章 用戶數據區
- 14.1 根文件系統區和用戶區的區別
- 14.2 用戶數據區
- 14.2.1 分區說明
- 14.2.2增加分區
- 14.2.3 分區內容制作
- 14.2.4 分區掛載
- 第三部分:應用篇
- 第1章 http網絡服務及文件傳輸
- 1.1 搭建服務
- 1.2 下載文件
- 第2章 TCP鏈路
- 2.1 IP通信
- 2.2 TCP特點和應用
- 2.2.1 特點
- 2.2.2 服務器建立
- 2.2.3 客戶端建立
- 2.3 實例
- 第3章 epoll機制
- 3.1 什么是epoll
- 3.2 實例
- 第4章 JSON格式及開源庫cJSON的移植
- 4.1 什么是JSON格式
- 4.2 cJSON庫
- 4.3 cJSON庫裁剪
- 4.4 創建JSON實例
- 4.5 解析JSON實例
- 第5章 jsoncpp的移植
- 5.1 創建JSON實例
- 5.2 解析JSON實例
- 第6章 TCP數據轉發服務器
- 6.1 link
- 6.2 linker
- 6.3 基本應用
- 6.2.1 服務器
- 6.2.2 客戶端
- 6.4 代理服務器
- 6.5 補充說明
- 第四部分:項目篇
- 項目篇的說明
- 第1章 串口通信協議設計
- 1.1 設計基礎
- 1.2 協議格式
- 第2章 zb_msg
- 2.1 串口通信類serial
- 2.2 協議處理zb_msg
- 2.3 交叉編譯測試
- 第3章 開源庫常見許可證
- 第4章 libevent異步事件庫的移植
- 4.1 什么是libevent
- 4.2 交叉編譯libevent
- 第5章 ev_base及ev_proxy
- 5.1 ev_base
- 5.2 ev_proxy
- 5.3 應用實例
- 第6章 openssl庫移植
- 6.1 什么是openssl
- 6.2 openssl的交叉編譯
- 第7章 基于libevent&openssl的https服務
- 7.1 重新交叉編譯libevent
- 7.2 httpd
- 7.3 應用實例
- 第8章 libmosquitto移植
- 8.1 什么是mosquitto
- 8.1.1 什么是MQTT
- 8.1.2 mosquitto
- 8.2 mosquitto的交叉編譯
- 第9章 AES加解密
- 9.1 簡介
- 9.2 應用實例
- 第10章 mqtter(支持AES加解密)
- 10.1 接口說明
- 10.2 源碼說明
- 10.3 應用實例
- 版權與免責聲明
- 版權聲明與免責聲明