编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • 质量保障

  • 产品思考

  • 软实力

  • 开发流程

  • Git应用

  • 技术模版

  • 技术规范

  • markdown

  • mermaid

  • license

    • 开源协议完全指南
    • MIT开源协议详解 协议详解
    • Apache开源协议详解 2.0 协议详解
    • GPL与LGPL协议详解 与 LGPL 协议详解
      • 一、GPL 是什么
      • 二、传染性机制:GPL 的核心
        • 2.1 什么是传染
        • 2.2 什么算"分发"
        • 2.3 静态链接 vs 动态链接
      • 三、GPL v2 vs GPL v3
        • 3.1 Tivoization 是什么
        • 3.2 专利条款
      • 四、LGPL:GPL 的温和版
        • 4.1 LGPL 的设计目的
        • 4.2 实际操作
        • 4.3 LGPL 代表项目
      • 五、AGPL:补上云服务漏洞
      • 六、选择指南
      • 七、常见问题
      • 八、总结
    • BSD与MPL协议详解
    • 开源协议企业实战与常见误区
  • 博客部署

  • 技术招聘

  • 测试经验

  • 技术
  • license
杨充
2025-06-06
目录

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
1
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 的设计就是为这个场景:动态链接不传染
1
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 库本身 → 修改部分必须开源
1
2
3
4

# 4.2 实际操作

# 闭源商业软件可以这样使用 LGPL 库:
my-closed-source-app
├── my-app.exe              ← 闭源,OK
└── libs/
    └── libffmpeg.so        ← LGPL 库,未修改,动态链接,OK
1
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 即可
1
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 文件级传染的妙用。

#GPL#LGPL#开源协议#传染性
上次更新: 2026/06/07, 21:36:05
Apache开源协议详解 2.0 协议详解
BSD与MPL协议详解

← Apache开源协议详解 2.0 协议详解 BSD与MPL协议详解→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式