对于桌面和移动平台应用

  • 官方说明如下
Qt for Application Development lets you create applications for desktop and mobile platforms. 
It contains all the Qt APIs and the Qt Creator IDE for seamless cross-platform development. Qt for Application Development is dual-licensed under commercial and open source licenses.
The commercial Qt license gives you the full rights to create and distribute software on your
own terms without any open source license obligations. With the commercial license you also
have access to the official Qt Support and close strategic relationship with The Qt Company
to make sure your development goals are met. Qt for Application Development is also available under GPL and LGPLv3 open source licenses.
Qt tools and some libraries are only available under GPL. See the comparison chart for details.
The Qt open source licensing is ideal for use cases such as open source projects with open
source distribution, student/academic purposes, hobby projects, internal research projects
without external distribution, or other projects where all (L)GPL obligations can be met. For more information, please see the FAQ.
  • Lincense 种类和费用

  • 各种 License 的权利和服务 (这里关心的是 LGPL 下,可以动态链接 Qt 库保持软件私有)

  • 不幸的是,有一些 Qt 库是以 GPL 的方式发布(鉴于 GPL 的传染性,就不能在私有软件中以任何方式使用这些库了,shit!)

  • 不幸的是,有一些 Qt 工具也是以 GPL 的方式发布的(但幸运的是,不更改的情况下,可以 LGPL 的方式使用,见对图中星号的解释)

对于嵌入式平台应用

With Qt for Device Creation, you can create embedded devices with modern UIs with maximum performance. 
In addition to Qt APIs, it comes with a full embedded tooling suite built around the Qt Creator IDE,
and additional embedded solutions that help you reduce your time-to-market dramatically. Qt for Device Creation is a product available only under a commercial license. This allows you to,
for example, control your device’s user experience, and build proprietary functionality on top of Qt
and to lock down your device. A commercial license from The Qt Company keeps your code proprietary
where only you can control and monetize on your end product’s development, user experience and distribution.

对动态链接 LGPL 授权的库,保持软件私有的解释

我们关心的是,包含 LGPL 的库在自己公司的商业闭源程序中是否可行。

LGPL协议是一个商业友好的协议。你可以使用 LGPL协议的库开发商业闭源程序。但是,它是有一些限制的。

- 如果你使用 LGPL 的库开发闭源程序,使用动态链接的形式,那么,你可以以任何形式发布你的应用程序,商业的、非商业的、开源的、非开源的,随你。

- 如果你因某种原因必须静态链接一个基于 LGPL 协议发布的库,那么你有义务进行下面的工作:

1. 你必须在你的文档中说明,你的程序中使用了 LGPL 库,并且说明这个库是基于 LGPL 发布的。
2. 你必须在你的应用程序发布中包含一份 LGPL协议,通常就是那个 Lincense 文本文件。
3. 你必须开放使用了 LGPL 库代码的所有代码,例如某些封装器。但是,其他使用这些封装器的代码就不需要开放了。
4. 你必须包含你的应用程序的余下部分的目标文件(通常就是我们所说的 .o 等等),或者是其他等价的文件,这部分源代码并不是必须的。

解读:

第1条,好理解。

第2条,好理解。

第3条,简单来说,LGPL 协议要求,如果你的类使用了 LGPL 库的代码,那么必须把这个类开源。例如,如果你的程序 app.exe 每个源文件都使用了 LGPL 库的代码,那么你的所有源代码都要开源。为了避免这种情况,我们通常编写一个封装器,把 LGPL 库的代码封装起来,这样就只需要开放这个封装器的代码,而其他使用了这个封装器的代码就不需要开放。

第4条,是对第3条的一种补充,那些使用了封装器的程序不需要开源,但是你必须把你编译的那些中间文件开放出来,Windows 下就是那些 .o 文件。

举例说明

假设我们使用一个名为 Lib 的库,这个库是基于 LGPL 协议发布的。

如果你使用 Lib.dll 做动态链接(Windows 下),好,一切 OK,你可以保持最终程序完全的私有。

如果你要使用静态链接,那么你需要如何组织你的代码。如果你有一个 main.cpp(我们假设所有使用 Lib 库的函数都是用了 lib_ 前缀):

main.cpp

int main()
{
lib_init();
lib_do_something();
lib_done();
lib_close();

return 0;
}

现在你已经完成了 main.cpp,但是你必须把它开源!因为它使用了 LGPL 库的代码。这是上面第三条规定的。

如果我不想把 main.cpp 开源,怎么办呢? 好,我新建一个文件 lib_wrapper.cpp:

 lib_wrapper.cpp

void my_lib_init()
{
lib_init();
} void my_lib_do_something()
{
lib_do_something();
} void my_lib_done()
{
lib_done();
} void my_lib_close()
{
lib_close();
}

main.cpp 中,我做相应的修改:

int main()
{
my_lib_init();
my_lib_do_something();
my_lib_done();
my_lib_close();
return0;
}

现在,main.cpp 不再是直接使用了 LGPL 库的代码了,因此它不需要开源,而我们的封装器 lib_wrapper.cpp 必须开源。

好,编译一下我们的程序,你会得到 main.o(Windows 下)这个目标文件。

在最终程序的发布中,我需要包含以下文件:

1.一份文档,其中声明:这个程序使用了 Lib 库,这个库是基于 LGPL 协议发布的。

2. LGPL.txt

3. lib_wrapper.cpp

4. main.o

这样,用户可以通过修改 lib_wrapper.cpp 的内容改变你使用 LGPL 库的方式,例如:

void my_lib_done ()
{
lib_done();
lib_close();
} void my_lib_close()
{
//lib_close();
}

然后编译这个 lib_wrapper.cpp,最终重新链接。一个新的可执行程序诞生啦!

相信到这里大家已经对 Qt 提供的这三种协议有了基本的了解,通常还会有一个疑问,就是基于这三种授权协议的Qt产品到底有多少功能上的区别,是不是商业版本的会更完整,性能更好一些?这里可以负责任的说:99%的代码都是一样的,无论是GPL, LGPL 还是 Commercial,功能,性能都没有区别,唯一的区别就在于授权协议的不同。

还有一点需要说明的就是,由于 LGPL 是在 Qt4.5 这个版本里面才引入的,所以之前的 Qt 版本,4.4 或者 3.x 的版本,并不提供 LGPL 协议,是不可逆的。同时未来发布的Qt版本,就一直会提供三种不同的授权协议版本。

总结: 鉴于 Qt 授权协议的限制,如果项目没有特别要求,建议使用 wxWidgets 开发商业产品

    如果以找工作为出发点,还是跟着 Qt 走吧

////////////////////////////////////////////////////////////////////////////////

本文部分内容来自于网友博客,如有侵权请联系我。

完。

Qt License 解读的更多相关文章

  1. 词频统计_输入到文件_update

    /* 输入文件见337.in.txt 输出文件见338.out.txt */ #include <iostream> #include <cctype> #include &l ...

  2. qt5.6 webengine兼容xp的编译方法

    http://www.qtcn.org/bbs/read-htm-tid-62470.html http://stackoverflow.com/questions/31678657/qtwebeng ...

  3. 【转】解读Qt 事件处理机制(上篇)

    [转自]:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...

  4. 【QT相关】类头文件解读、QT编辑模式、读取text文本

    Wizard产生的头文件类包含了必须的#include文件.构造函数.析构函数和UI对象: #include <QMainWindow> namespace Ui {class Notep ...

  5. QT 报错:Project ERROR: Xcode not set up properly. You may need to confirm the license agreement by running /usr/bin/xcodebuild.

    1.打开终端,输入指令并按回车键: sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer 2.如果电脑设置有密码,终 ...

  6. Qt第三方库QCustomPlot——QCustomPlot解读

    这个小部件类,对于QCustomPlot的所有方面都有所体现 下面阅读它的函数: 函数组织顺序为: 基本设置---添加图线---删除图线---添加额外Item---层次管理---坐标轴管理----导出 ...

  7. QVariant相当于一个包含大多数Qt数据类型的联合体(源码解读)

    将数据存储为一个Private结构体类型的成员变量d: <qvariant.cpp> 1 QVariant::QVariant(Type type) 2 { create(type, 0) ...

  8. linux(debian) arm-linux-g++ v4.5.1交叉编译 embedded arm 版本的QtWebkit (browser) 使用qt 4.8.6 版本

    最近需要做一个项目 在arm 架构的linux下 没有桌面环境的情况下拉起 有界面的浏览器使用. 考虑用qt 的界面和 qtwebikt 的库去实现这一系列操作. 本文参考: Qt移植到ARM Lin ...

  9. A Simple OpenCASCADE Qt Demo-occQt

    A Simple OpenCASCADE Qt Demo-occQt eryar@163.com Abstract. OpenCASCADE have provided the Qt samples ...

随机推荐

  1. 从零打卡leetcode之day 2---两数相加

    前言 就是要把leetcode刷完,每天一道题,每天进步一点点. 从零打卡leetcode之day 2 题目描述: 给定两个非空链表来表示两个非负整数.位数按照逆序方式存储, 它们的每个节点只存储单个 ...

  2. 【转载】ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇

    转自:http://www.cnblogs.com/essenroc/p/8627775.html 这篇文章将介绍ASP.NET Core中使用 开源项目 Payment,实现接入支付宝-电脑网页支付 ...

  3. 【Java基础】【07面向对象-构造方法&静态static】

    07.01_面向对象(构造方法Constructor概述和格式)(掌握) A:构造方法概述和作用 给对象的数据(属性)进行初始化 B:构造方法格式特点 a:方法名与类名相同(大小也要与类名一致) b: ...

  4. web进修之—Hibernate 关系映射(3)

    概述 Hibernate的关系映射是Hibernate使用的难点或者是重点(别担心,不考试哦~),按照不同的分类方式可以对这些映射关系做一个分类,如: 按对象对应关系分: 一对一 多对一/一对多 多对 ...

  5. SmartSql For Asp.Net Core 最佳实践

    常规操作 安装 SmartSql Install-Package SmartSql 安装 SmartSql.DIExtension Install-Package SmartSql.DIExtensi ...

  6. NTP服务器搭建

    NTP服务器搭建 :http://www.jbxue.com/LINUXjishu/22352.html 客户端配置: vim /etc/ntp.conf #server 0.centos.pool. ...

  7. 打造自己的.NET Core项目模板

    前言 每个人都有自己习惯的项目结构,有人的喜欢在项目里面建解决方案文件夹:有的人喜欢传统的三层命名:有的人喜欢单一,简单的项目一个csproj就搞定.. 反正就是萝卜青菜,各有所爱. 可能不同的公司对 ...

  8. REST API设计指导——译自Microsoft REST API Guidelines(四)

    前言 前面我们说了,如果API的设计更规范更合理,在很大程度上能够提高联调的效率,降低沟通成本.那么什么是好的API设计?这里我们不得不提到REST API. 关于REST API的书籍很多,但是完整 ...

  9. Redis应用之[限制访问频率]

      我们知道当网站的访问量突然很大的时候肯定会对服务器造成影响,甚至无法访问,如果是正常的访问那么很好说明业务量增大可以考虑系统的扩展,但是如果是搜索引擎爬虫频繁访问或是一些恶意访问,那这时候我们就应 ...

  10. eclipse中的出现在打包一次后,后面新建的项目都出错了,出现support_v7下面出现红线及解决方法及为什么eclipse中项目继承ActionBarActivity解决方法一样

    第一次写博客,有什么问题或者想法的希望各位可以进行评论交流,望大家多多包涵! 遇到的问题是在新建的项目都出错了,出现support_v7下面出现红线及解决方法及为什么eclipse中项目继承Actio ...