如何选择开源许可证?

2023-11-17

作者: 阮一峰

日期: 2011年5月 2日

如何为代码选择开源许可证,这是一个问题。

世界上的开源许可证,大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种----GPLBSDMITMozillaApacheLGPL----之中做选择,也很复杂。

乌克兰程序员Paul Bagwell,画了一张分析图,说明应该怎么选择。这是我见过的最简单的讲解,只用两分钟,你就能搞清楚这六种许可证之间的最大区别。

下面是我制作的中文版,请点击看大图。


(完)

yazhouren我找的其他资料:

开源 != GPL。在GPL被发明以前,就已经存在很多优秀的开源的组织,产品,许可证,和软件了,最著名的,请搜索 “BSD”(或者 freebsd、openbsd等等都行)。
至于为什么库一级的代码为什么要采取 LGPL,这完全是开发者自己的选择,或者说,在某种程度上是迫不得已,因为如果所有只要沾上 GPL 就必须 GPL 的话,那商业公司还活不活?没有了商业公司,谁给你钱做研究?谁给你提供硬件?目前人类社会的生产力水平还不足以大步跨入共产主义吧?LGPL 可以看作是GPL对商业的妥协,如果没有这个妥协,GNU 的一切到现在为止很可能还是RMS自己屋子里的一个玩具而已。

Linux 内核基于GPL第2 版。在内核社区,人们一直在争论是否应该支持GPL的最新版本GPL v3 。目前的趋势似乎是反对采取GPL v3 。

 

通过系统调用访问内核服务的 Linux 应用程序没有被看作衍生的工作, 因此并不受限于 GPL。而库则采用GNU轻量级通用公共许可证(GNULesser General Public License , LGPL),其限制要少于 GPL 。专有软件也允许与 LGPL下的库动态链接 。

GNU 项目的主要支撑者-- 自由软件基金会,创造了GNU公共许可证 (GNU PublicLicense , GPL), 它 也 被 称为 copyleft[ ② ] , 以 防止有人中途将自由软件转化为专有软件 。 如果某人修改 了 copyleft 的软件 ,就必须以 copyleft 的方式分享他的软件 。 GNU 系统中的 Linux 内核以及像GNU 编译器( GNU Compiler Collection , GCC ) 等大部分组件都以 GPL 发布 。 因此,如果你修改了内核, 你就必须在社区分享此修改 。 基本上,你必须以 copyleft 的形式将授予你的权利传递出去。

yazhouren我的理解:我认为GCC等工具,我们只是使用,而不会去调用GCC的什么功能或函数接口,所以GCC GPL许可证对于我们开发软件没有影响

当我们在linux上开发软件时,我们只是调用一些库和linux的系统调用。调用系统调用没有被看为衍生的工作,所以我们写的代码不用遵循GPL。当调用库时,我们就可以根据库采用的协议的种类来看我们的权限。一般的库采用LGPL,所以我们可以使用该库源代码接口,来编写我们的程序,而我们的程序不用开源。如果改动了库的源代码,必须把库源代码开源!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何选择开源许可证? 的相关文章

  • 有没有办法将 fopen_s() 与 GCC 一起使用,或者至少创建一个 #define ?

    MSVC 编译器说fopen 已弃用 建议使用fopen s 有什么办法可以使用吗fopen s 并且仍然便携 任何想法 define 微软的 s函数是不可移植的 我通常使用等效的 C89 C99 函数并禁用弃用警告 define CRT
  • 将用户添加到组但运行“id”时未反映

    R 创建了一个名为 Staff 的组 我希望能够在不以 sudo 身份启动 R 的情况下更新软件包 所以我使用以下方法将自己添加到员工中 sudo usermod G adm dialout cdrom plugdev lpadmin ad
  • 使用 gatttool 或 bluepy BLE 订阅通知

    我正在使用 bluepy 编写一个程序 用于监听蓝牙设备发送的特征 我还可以使用任何库或语言 唯一的限制是在 Linux 上运行 而不是在移动环境中运行 似乎仅在移动设备中广泛使用 没有人在桌面上使用 BLE 使用 bluepy 我注册了委
  • 类似 wget 的 BitTorrent 客户端或库? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 是否有任何
  • 在 C 中使用 sqrtf():“未定义对‘sqrtf’的引用”

    我正在使用Linux Ubuntu 12 04 https en wikipedia org wiki Ubuntu version history Ubuntu 12 04 LTS 28Precise Pangolin 29 Precis
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • 如何从脚本向 sudo 提供密码?

    请注意 这是在我的本地计算机上运行的来宾虚拟机 VBox 我不担心安全性 我正在编写一个将在 Linux Ubuntu VM 上执行的脚本myuser用户 该脚本将在下面创建一个非常大的目录树 etc myapp 目前我必须手动完成所有这些
  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • Linux下的C#,Process.Start()异常“没有这样的文件或目录”

    我在使用 Process 类调用程序来启动程序时遇到问题 可执行文件的层次结构位于 bin 目录下 而当前工作目录需要位于 lib 目录下 project bin a out this is what I need to call lib
  • 即使 makefile 和源代码存在,为什么“Build Project”在 Eclipse Helios CDT 中显示为灰色?

    我无法构建我的项目 我在 Eclipse Helios 中创建了一个新的 CDT 项目 并告诉它使用现有的源代码和 makefile 这两者都正确显示在 Package 和 Project 视图中 然而 项目 菜单中的 构建全部 和 构建项
  • 跟踪 pthread 调度

    我想做的是创建某种图表 详细说明 Linux 中 两个 线程的执行情况 我不需要查看线程的作用 只需查看它们何时被安排以及持续多长时间 基本上是一条时间线 在过去的几个小时里 我一直在互联网上搜索跟踪 pthread 调度的方法 不幸的是
  • jpackage linux 创建的桌面文件不足

    我刚刚开始使用 jpackage 它是一个非常棒的工具 只要迈出一步 我的肩上的工作就减轻了很多 我对看起来硬编码且无法定制的东西越感到惊讶 JPackage 自动生成启动器 lib
  • `printf()` 中格式说明符“%qd”的用途是什么?

    我看到格式说明符 qd浏览时github https github com Microsoft clang blob master test Sema format strings c代码 然后我检查了 GCC 编译器 它工作正常 incl
  • xdotool 类型需要很长时间并导致整个桌面冻结

    我一直在使用xdotool type过去只能在快捷方式上输入耸肩xdotool type 这可行 但总是需要相当长的时间 并导致整个桌面冻结 完全冻结 而不仅仅是输入 几秒钟 不过并没有太打扰我 现在我需要一种方法来从文件中读取内容 对其进
  • 如何使用libaudit?

    我试图了解如何使用 libaudit 我想接收有关使用 C C 的用户操作的事件 我不明白如何设置规则 以及如何获取有关用户操作的信息 例如 我想获取用户创建目录时的信息 int audit fd audit open struct aud
  • 使用 MongoDB docker 镜像停止虚拟机而不丢失数据

    我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 映像 并且数据库上已经有数据 如果我停止虚拟机 以节省过夜费用 我会丢失数据库中包含的所有数据吗 在这些情况下我怎样才能让它持久 有多种选择可以实现此目的 但
  • 如何使用 bash 脚本关闭所有终端,在每个终端中有效地按 Ctrl+Shift+Q

    我经常打开许多终端 其中一些正在运行重要的进程 例如服务器 而另一些则没有运行任何东西并且可以关闭 如果您按 重要 则会弹出确认提示Cntrl Shift Q在其中 如下所示 我想要一个 bash 脚本 它可以关闭所有终端 但将 重要 终端
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • 如何在编译C代码时禁用警告?

    我正在使用 32 位 Fedora 14 系统 我正在使用编译我的源代码gcc 有谁知道如何在编译c代码时禁用警告 EDIT 是的 我知道 最好的办法是修复这些警告以避免任何未定义 未知的行为 但目前在这里 我第一次编写了巨大的代码 并且在
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并

随机推荐

  • 超详细手把手教你App上线AppStore

    作为一个iOSer上线流程是不可或缺的技能 今天就带领大家重温上线流程 一 准备工作 已付费的开发者账号 开发者账号分为以下四种类型 个人 Individual 资费 99 年 公司 Company 99 年 企业 Enterprise 2
  • C# RichTextBox显示不同颜色文字

    region 日志记录 支持其他线程访问 public delegate void LogAppendDelegate Color color string text
  • C语言(关于unsigned char的几个问题)

    关于unsigned char unsigned char是char 的无符号类型 同char一样占用1个字节 存储范围为0 255 所存储的数据服从以下规律 数据服从于一个闭环 当我们输入0 255之间的数据之时 以0为起点 顺时针走向
  • CentOS安装MariaDB

    CentOS安装MariaDB 此处以CentOS 7 x86 64 安装MariaDB 10 2为例 MariaDB数据库是 MySQL 的一个分支 主要由开源社区在维护 采用 GPL 授权许可 MariaDB完全兼容 MySQL 包括A
  • Java并发测试中的发现

    这个程序是用来测试线程并发性用的 可以看出这个程序存在的问题还是很多的 1 共享变量count没有实现可见性 2 count 操作不是原子操作 内部可能发生重排序 我的目标是让结果为threadA和threadB的结果任何一个得出20000
  • mysql show tables like,带多个LIKE值的SHOW TABLES语句

    mysql gt SHOW TABLES like cms Tables in tianyan cms cms 1 row in set 0 00 sec Result mysql gt SHOW TABLES like cms or li
  • 火猴之产品组成热点图编程(firemonkey)

    效果图 用途 地图 产品组成 举例 以产品组成为例 如最近最火的机甲大师 思路 1 组件 TMSFMXHotSpotImage1 TMSFMXHTMLText1 2 加载背景 编辑热点区域 代码 操作 1 右键窗体 打开编辑热点窗口 2 加
  • Delphi游戏开发网址大全[转贴]

    Source Code http www codefans com CodeList Catalog 5 CodeTime Desc 1 html http www vscodes com sitemap html http www itl
  • 推荐4个Flutter重磅开源项目

    早上好 骚年 我是小 G 我的公众号 菜鸟翻身 会推荐 GitHub 上有用的项目 一分钟 get 一个优秀的开源项目 挖掘开源的价值 欢迎关注我 近年来 随着移动智能设备的快速普及 移动多端统一开发框架已成为一个热门话题 这里为你整理了
  • Tomcat配置虚拟目录

    一 直接在Tomcat的目录中配置虚拟目录 可能会出现的错误 当你输入地址 http localhost 端口号 demo 时可能会出现404 此时 可修改conf文件夹下的web xml中找到如下所示代码 将红框内false改为true即
  • React基础第一天-jsx

    React 基础 整体介绍 内容介绍 React 概述 JSX React 组件基础 React 介绍 目标 了解react的基本概念 是什么 React 官网 React 中文网 React 官网新版尝鲜 React 是用于构建用户界面的
  • 一起学nRF51xx 13 - twi & iic

    前言 在IIC总线是PHILIPS公司推出的一种串行总线 IIC总线有2根信号线SCK 时钟线 和SDA 数据线 NRF51822中所谓的TWI总线跟IIC总线兼容 这里统称为IIC总线 IIC总线规定了不同类型的从机拥有不同的IICADR
  • 分享一个关于单片机利用定时器去卡中断操作的方法

    首先 我们知道 比如我们要去实现灯的一秒一次的亮灭 一开始想到的办法肯定是加延时啦 大多数人想的肯定是 OPEN LED DELAY MS 1000 CLOSE LED DELAY MS 1000 这种方法肯定可行啦 但是有没考虑一个后果
  • 内容管理系统——后台登录

    在课上 我通过 Laravel框架开发实践 一书学习了有关PHP的知识和应用 也通过书本上的 内容管理系统 案例实践并应用了所学的知识 下面将对这一案例中的后台登录模块进行介绍 目录 前言 一 创建用户表 二 显示登录页面 1 登录表单 2
  • R语言处理Time series

    Time series Introduction Simple time series models ARIMA Validating a model Spectral Analysis Wavelets Digital Signal Pr
  • Java当中读取Json文件转换为Java对象

    这里我用的是一个hutool工具包 里面包含了很多丰富的util 并且还有中文的API
  • Qt对象树

    一 什么是对象树 Qt中的对象树就是Qt中对象间的父子关系 每一个对象都有它所有子对象的指针 都有一个指向其父 二 示例 1 创建一个MyPushButton对象 继承QPushButton 2 在mypushbutton cpp中对MyP
  • virtIO前后端notify机制详解

    本来这是在前端驱动后期分析的 但是这部分内容比较多 且分析了后端notify前端的机制 所以还是单独拿出一节分析比较好 还是拿网络驱动部分做案例 网络驱动部分有两个队列 忽略控制队列 接收队列和发送队列 每个队列都对应一个virtqueue
  • FFmpeg:UDP外网传输花屏严重问题完美解决

    1 前言 最近发现 UDP外网传输是 丢帧严重 我的环境是 视频流是济南移动 播放端是济南电信家庭宽带 由于视频流没有固定IP 所以我想了一个办法 让视频流网络穿透 直接点对点传输到我的播放端 但是发现我的播放端花屏严重 如下图 2 解决
  • 如何选择开源许可证?

    作者 阮一峰 日期 2011年5月 2日 如何为代码选择开源许可证 这是一个问题 世界上的开源许可证 大概有上百种 很少有人搞得清楚它们的区别 即使在最流行的六种 GPL BSD MIT Mozilla Apache和LGPL 之中做选择