最近在用GTK写一些工具,因此写一个基础教程系列,总结学习成果。程序员
GTK是一款开源的、面向多平台的GUI工具箱,其英文全称为GIMP Toolkit。最初是Peter Mattis 和 Spencer Kimball 为GNU Image Manipulation Program (GIMP)编写,用来替代付费的Motif。在后续的发展中,它已经成为通用的GUI库,应用于愈来愈多的程序,Linux平台的图形应用程序的半壁江山都是使用GTK编写的。浏览器
GTK的英文全称,让我想到了GCC。GCC最初定位于GNU C Compiler,但随着支持的编译器愈来愈多,它的定义已经包不住编译器的多样性,因此如今改为了GNU Compiler Collection。这样看来,是否是GTK的名字也得换换了,毕竟现有的名字很局限。框架
GTK是使用C语言写的,因此其原生API都是面向C的,同时GTK的一大特色是,在C语言层面实现了面向对象的特性。若是你是用C++语言做为开发语言、调用GTK的C接口的话,使用会稍显繁琐,这是语言层面的差别,跟框架关系不大。正是为了不不一样语言调用C的繁琐,GTK提供了多语言的绑定,为不一样的语言提供同等抽象级别的语言调用,这样C++程序员就能够直接调用C++的语言绑定,使用方式友好。工具
GTK是彻底免费的,并且基于LGPL协议,这能够保证私有软件经过连接使用GTK能够不把软件源代码开放,对商业应用较友好,这跟GPL协议是不同的。也正是LGPL协议,使得早些年Gnome(基于GTK编写)风头赛过KDE(基于QT编写)。学习
GTK是跨平台的,支持Unix类的系统、Windows,甚至手机平台。以前我专门有篇文章介绍了在Windows下的环境搭建,C语言的开发环境的搭建仍是很是容易的。ui
关于名字。从网上的资料上,你能够看到GTK+的字眼,这个加号官方是有描述的:spa
The "plus" was added to "GTK" once it was moved out of the GIMP sources tree and the project gained utilities like GLib and the GTK type system, in order to distinguish it from the previous, in-tree version.
大意是:GTK从GIMP独立出来以后,加入了一些GLib和GTK类型系统的支持,为了和GIMP代码树中的版本区分,因此带上加号,这一区分就是好多年,给广大的人民群众带来了不小的认知麻烦。在今年,官方终于决定把加号去掉,之后直接叫GTK。开放源代码
关于版本。如今开源的大环境是采用刷版本的方式,像火狐浏览器,谷歌浏览器版本蹭蹭的涨。以前GTK一直采用小步慢跑的版本方式,估计也快要刷版本了,下面引用一篇旧闻:3d
GNOME开发者在多伦多举办的GTK会议上讨论了新的Gtk发布方案,针对Gtk 3.x系列中的问题,开发者提议加快大版本的发布速度:每两年发布一个大版本如 Gtk 四、Gtk 5和Gtk 6,每6个月发布一个与旧版本不兼容的小版本,如Gtk 4.二、Gtk 4.4和Gtk 4.6。这项计划意味着Gtk 4.0 不是咱们将称之为 Gtk 4的最终稳定API。新的大版本能与旧的版本并行安装,如Gtk 4 和Gtk 3能安装在一个系统中,但不兼容的小版本不能,它们使用了相同的pkg-config名字和头文件目录。每个连续小版本的API将逐渐成熟稳定,也就是说Gtk 4.6发布时API将最终稳定下来,Gtk 4.6能够称之为 Gtk 4了。使用Gtk的开发者能够选择跟随稳定的版本。
这条最实在。大的组织,好比公司,也是很注重成本的;小的我的,财务的承受能力也是有限的,这是GTK的诞生的缘由。并且,不少软件受权真的不便宜。对象
这是GTK的重大优点之一。GTK支持gobject-introspection,大大简化了语言绑定的编写。GTK的Haskell绑定haskell-gi,也得益于这一条。其余语言框架,好比QT,虽然很优秀,但提供的语言绑定实在是太少了,或者是语言绑定支持的完成度不高,与GTK差距不小。以前我推荐过两款国产GUI框架:duilib和nana,即便很是喜欢,但由于没有Haskell的绑定,只能做罢。
如下是官方列出的不彻底列表:
这点也须要特殊说明一下。在05年接触Linux那会,以及随后的几年,Gnome桌面环境在稳定性方面完胜KDE,KDE桌面崩溃就是屡见不鲜,固然这不必定就是由GTK和QT的稳定性形成的,但的确给个人选择带来了影响。因此这些年一直在用Gnome桌面。
抛去上面不论,GTK的稳定性也是极好的。
GTK的受权要求把相关更改的代码开放,这使得改动能够为你们享用,这也是开放源码带来的好处。开放源码的项目,我的一样能够参与,这样能够提升本身的水平,为社区作点贡献。
如今不少GUI框架都是跨平台的,这没有什么显摆的。但当你有特殊需求时,才知道跨平台是多么重要。
请继续关注个人公众号文章