如何选择开源许可证?

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(使用前将#替换为@)

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

  • GCC:分段错误和调试程序仅在优化时崩溃

    这是线程的后续内容 C 分段错误 也许 GDB 在骗我 https stackoverflow com questions 22828609 c segmentation fault and maybe gdb is lying to me
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • 如何从 Bash 命令行在后台 Vim 打开另一个文件?

    我正在从使用 Gvim 过渡到使用控制台 Vim 我在 Vim 中打开一个文件 然后暂停 Vim 在命令行上运行一些命令 然后想返回到 Vim Ctrl Z 在正常模式下 暂停 Vim 并返回到控制台 fg可用于将焦点返回到 Vim job
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • Ruby:在 Ubuntu 上安装 rmagick

    我正在尝试在 Ubuntu 10 04 上安装 RMagick 看起来here https stackoverflow com questions 1482823 is there an easy way to install rmagic
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • LINUX:如何锁定内存中进程的页面

    我有一个 LINUX 服务器 运行一个具有大量内存占用的进程 某种数据库引擎 该进程分配的内存太大 需要将其中一部分换出 换出 我想做的是将所有其他进程 或正在运行的进程的子集 的内存页面锁定在内存中 以便只有数据库进程的页面被换出 例如
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • 如何在线程创建和退出时调用函数?

    include
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • 如何正确初始化“min”变量?

    我的代码中有一个小问题 用于从一系列数字中查找最小值 当我初始化时min 0 最小值结果为0 但是当我不初始化时min 答案是正确的 为什么会出现这种情况 Xcode 告诉我应该初始化min多变的 int a 20 0 int max 0
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include

随机推荐

  • 超详细手把手教你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 之中做选择