我们在开发过程中,如果引用到了开源库,一定一定要小心,尤其是在大公司工作时的产品开发,一定要明白开源库的来源,以及许可证的限制;不然可能会导致公司巨大的法律风险,目前在软件开发中最常见的许可证有如下几种:
(详细情况可以查看网站:[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许可证。
###
以下是一张帮助理解的大致图片,具体请登录到本章开头的链接中进行了解。
:-:
![](https://img.kancloud.cn/1b/b0/1bb0369b1e9d2e58c5a076c3e6ac7a42_832x544.png =700x)
- 《嵌入式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 应用实例
- 版权与免责声明
- 版权声明与免责声明