GPL与LGPL协议详解 与 LGPL 协议详解
# GPL 与 LGPL 协议详解
# 一、GPL 是什么
GPL(GNU General Public License)由自由软件基金会(FSF)创始人 Richard Stallman 于 1989 年发布,是开源世界最具争议也最有影响力的协议。
它的核心思想可以用一句话概括:你用了我的代码,你的代码也必须自由。
这个特性被称为"Copyleft"(著佐权)——与 Copyright(著作权)相反。实际效果上被称为"传染性"。
# 二、传染性机制:GPL 的核心
# 2.1 什么是传染
你的项目
├── src/your-code.js ← 你的代码
├── lib/gpl-library.js ← GPL 协议的第三方库
└── LICENSE ← 使用了 GPL 代码 → 必须 GPL
2
3
4
一旦你的代码依赖了 GPL 协议代码,无论你修改了多少,整个项目在分发时都必须以 GPL 协议开源。
# 2.2 什么算"分发"
- ✅ 把软件发给客户、放到 App Store、刻成光盘 → 触发传染
- ❌ 公司内部使用、自己电脑上用 → 不触发
- ⚠️ SaaS 形式(通过网络提供服务) → GPL v2/v3 不触发(但 AGPL 触发)
# 2.3 静态链接 vs 动态链接
静态链接:GPL 代码编译进了你的 .exe/.app 里
→ 你的程序受传染,必须 GPL 开源
动态链接:你的程序运行时加载 GPL 的 .dll/.so/.dylib
→ 法律上有争议,但 FSF 认为也受传染
→ LGPL 的设计就是为这个场景:动态链接不传染
2
3
4
5
6
# 三、GPL v2 vs GPL v3
| 特性 | GPL v2 | GPL v3 |
|---|---|---|
| 发布年份 | 1991 | 2007 |
| 传染性 | 强 | 强 |
| 专利授权 | 隐式(没说) | 显式授权 |
| Tivoization 防护 | 无 | 有 |
| 兼容 Apache 2.0 | ❌ | ✅ |
| 代表项目 | Linux 内核 | GCC、Bash |
# 3.1 Tivoization 是什么
TiVo 是一家机顶盒公司,它用 GPL v2 的 Linux 内核做产品。虽然 TiVo 公开了源代码,但硬件会检查签名——用户修改了代码编译后烧不进设备。
GPL v3 新增条款:如果你提供了 GPL v3 代码,还必须提供安装修改版本的方法。 这就是"反 Tivoization"条款。
这也是为什么 Linux 内核坚持用 GPL v2——Linus Torvalds 不喜欢 GPL v3 的这个条款。
# 3.2 专利条款
GPL v3 的专利条款与 Apache 2.0 类似:如果你贡献了包含专利的代码,就自动授予使用者专利许可。如果你起诉任何 GPL v3 软件的用户侵犯专利,你授予的专利许可自动终止。
# 四、LGPL:GPL 的温和版
# 4.1 LGPL 的设计目的
GNU 意识到:如果一个基础库(如 C 标准库的替代品 glibc)用 GPL,那所有用了它的商业软件都必须开源——等于把整个软件生态锁死了。
于是有了 LGPL(Lesser GPL):
LGPL 规则:
├── 动态链接 LGPL 库 → 闭源软件 OK,不需要开源
├── 静态链接 LGPL 库 → 需要开源或提供目标文件供重新链接
└── 修改了 LGPL 库本身 → 修改部分必须开源
2
3
4
# 4.2 实际操作
# 闭源商业软件可以这样使用 LGPL 库:
my-closed-source-app
├── my-app.exe ← 闭源,OK
└── libs/
└── libffmpeg.so ← LGPL 库,未修改,动态链接,OK
2
3
4
5
# 4.3 LGPL 代表项目
| 项目 | 协议 | 说明 |
|---|---|---|
| FFmpeg | LGPL / GPL | 默认 LGPL,启用某些功能变成 GPL |
| Qt | LGPL / 商业 | 开源版 LGPL,商业版需付费 |
| glibc | LGPL | C 语言基础库 |
| GTK | LGPL | GUI 工具包 |
# 五、AGPL:补上云服务漏洞
标准 GPL 的传染只在"分发"时触发。如果通过 SaaS 提供服务,不算分发,可以绕过 GPL。
AGPL(Affero GPL)补上这个洞:只要用户通过网络使用你的服务,就触发传染。
| 协议 | 内部使用 | 分发软件 | SaaS 提供服务 |
|---|---|---|---|
| GPL v2/v3 | ❌ 不传染 | ✅ 传染 | ❌ 不传染 |
| AGPL | ❌ 不传染 | ✅ 传染 | ✅ 传染 |
MongoDB 被 AWS 用 AGPL 版本做了个云服务卖钱后,一怒之下改成了更严格的 SSPL。
# 六、选择指南
你的项目是基础库,希望被广泛使用?
├── 希望商业软件也能用 → LGPL
└── 希望商业软件也必须开源 → GPL
你的项目是完整应用(非库)?
├── 不想被竞品闭源复制 → GPL v3
├── 要兼容 Apache 2.0 生态 → GPL v3
└── 要兼容 Linux 内核(GPL v2)→ GPL v2
你的项目是云服务?
├── 不想被云厂商白嫖 → AGPL
└── 不在乎 → GPL 即可
2
3
4
5
6
7
8
9
10
11
12
# 七、常见问题
Q: 我在 GPL 项目中引用了一个 MIT 库,整个项目要 GPL 吗? A: 你的项目本身是 GPL,MIT 库不受影响(MIT 和 GPL 兼容)。下游使用者使用你的项目时,仍受 GPL 约束。
Q: 我 fork 了 GPL 代码只改了一行,整份代码可以闭源吗? A: 不能。修改哪怕一行,整个项目分发时都必须 GPL 开源。
Q: 公司内部用 GPL 代码开发的工具,只给员工用,需要开源吗? A: 不需要。GPL 只在分发时触发。
Q: 我写了个插件,加载到 GPL 程序中,我的插件必须 GPL 吗? A: 法律上有争议。FSF 认为"是"(一个程序的插件是衍生作品)。商业上建议把插件独立发布或咨询律师。
# 八、总结
| 协议 | 一句话 |
|---|---|
| GPL v2 | 用了就必须开源,专利默示,兼容性差 |
| GPL v3 | GPL v2 + 专利显式 + 反硬件锁定 + 兼容 Apache 2.0 |
| LGPL | 动态链接不传染,静态链接需提供重链接能力 |
| AGPL | GPL v3 + SaaS 也算分发 |
🏃 下一篇:BSD 与 MPL 详解——BSD 三条款的区别、MPL 文件级传染的妙用。