虽然GTK+是Linux下的开发环境,因为其跨平台特性,有时候需要在Windows上用到它的。如下是在Windows10下配置GTK+的开发环境。
Gnome的开发基础结构是围绕一组函数库的,所有的内容都是用可移植的ANSI C语言写成的,可以用于所有类UNIX系统,与图形相关的函数库依赖于X Window系统。 Gnome函数库是最高层的。GTK+由两部分组成,GTK和GDK。 GTK层为C语言提供了一个对象模型,并为UI工具包提供了最基本的widget,它是上层GUI派生的基础。 GTK是依赖于GDK的,GDK是Xlib的一个底层包装,Xlib库直接与X服务器对话。 除了Xlib以外的任何部分都是基于GLib的,它是一个有用的C函数库,提供了很多实用程序和可移植的功能以及一组容易被C语言使用的容器。
一个Gnome程序使用多个库组成的层次结构: Gnome库在最高层,包括帮助例程,类和特殊的widget,并为应用程序提供一个基础架构。第二层是GTK,它是GTK+库的一部分。这个库提供了基本的工具包和widget来创建GUI应用程序。大多数GUI是直接用GTK编写的。GTK同时为Gnome库提供了一个功能强大的对象系统。 再下一层是GDK,它简单的对X函数库进行了包装,只有在我们进行特殊绘画或设置窗口的特殊属性的时候才会用到它. 最下面一层是Glib,它是C的一个实用程序库,包括可移植性和一些实用程序功能,以及一些容器类,例如:链表,可变数组,变长字符串,HASH(貌似是哈西表),缓存,一个事件循环和其他有用的结构。
(1)进入GTK+的官方网站http://www.gtk.org/,点击Download,选择相应的版本进入。
(2)若要下载、解压、整理那些单独的文件,则不是很方便,所以就可以选择有”All-in-one bundles” 的链接,点击下载。
解压完成,复制到/etc/gtk(也可以自定义其他目录),可以看到一些目录文件夹,主要包括:bin、etc、include、lib、man、manifest、share、src。其中bin目录下主要包含一些可执行文件和动态链接库,lib目录主要包含一些库文件、include主要包含的是一些头文件。
注:最近可在windows下安装MSYS2(Minimal SYStem 2),它是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境,同时它也是一个在Cygwin (POSIX 兼容性层) 和 MinGW-w64(从"MinGW-生成")基础上产生的,追求更好的互操作性的 Windows 软件。它集成了pacman和Mingw-w64的Cygwin升级版, 提供了bash shell等linux环境、版本控制软件(git/hg)和MinGW-w64 工具链。与MSYS最大的区别是移植了 Arch Linux的软件包管理系统 Pacman(其实是与Cygwin的区别)。参考:https://msys2.github.io/ 。
This is a bundle containing the GTK+ stack and its dependencies for Windows. As such it is nothing more than a combination of the individual packages it consists of. Here is a shortened list : - GTK+ 3.6.4 (patched) ; - GLib 2.34.3 ; - GDK-Pixbuf 2.26.5 ; - Pixman 0.26.0 ; - Cairo 1.10.2 (patched) ; - Pango 1.30.1 ; - ATK 2.6.0. Both run-time and developer packages are included. This bundle is intended for software developers and packagers. You are expected to know what to do with it, more or less. To use it, create some empty folder like "c:\gtk", Using either Windows Explorer's built-in zip file management, or the command-line unzip.exe, available for instance at ftp://tug.ctan.org/tex-archive/tools/zip/info-zip/WIN32/unz552xN.exe unzip this bundle. Avoid Winzip! It is known to behave oddly. (But you presumably already did extract the files, as you are reading this file.) Then add the bin folder to your PATH. Make sure you have no other versions of GTK+ in PATH. Run: pkg-config --cflags gtk+-3.0 and verify that it prints out something reasonable. Prepare Pango : pango-querymodules > c:\gtk\etc\pango\pango.modules Prepare GDK-Pixbuf : gdk-pixbuf-query-loaders > c:\gtk\lib\gdk-pixbuf-2.0\2.10.0\loaders.cache Prepare GTK+-IMModules : gtk-query-immodules-3.0 > c:\gtk\lib\gtk-3.0\3.0.0\immodules.cache Run: gtk3-demo and verify that it works.(1)配置环境变量
(2)然后按照帮助文档执行pango-querymodules、gdk-pixbuf-query-loaders、gtk-query-immodules-3.0,接着运行GTK+的例子:
#include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *label; //初始化GTK+库 gtk_init(&argc, &argv); //创建主窗口 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //设置窗口大小 gtk_widget_set_size_request(window,300,300); //设置标题 gtk_window_set_title(GTK_WINDOW (window), "Hello World"); //当窗口即将被销毁,停止主GTK+循环 g_signal_connect(window, "destroy",G_CALLBACK (gtk_main_quit), NULL); //创建一个"Hello World"标签 label = gtk_label_new("Hello, World"); //将标签加入到主窗口 gtk_container_add(GTK_CONTAINER (window), label); //设置窗口中的所有元素可见 gtk_widget_show_all(window); //开始主循环,让它在那里休息,直到应用程序关闭 gtk_main(); return 0; }(3)添加GTK的头文件和库(pro文件)
CONFIG += link_pkgconfig PKGCONFIG += gtk+-3.0最后的pro文件是:
#------------------------------------------------- # # Project created by QtCreator 2015-08-30T02:36:02 # #------------------------------------------------- TARGET = helloworld TEMPLATE = app CONFIG += link_pkgconfig PKGCONFIG += gtk+-3.0 #INCLUDEPATH += C:/gtk/include/gtk-3.0 C:/gtk/include/cairo C:/gtk/include/pango-1.0 \ # C:/gtk/include/atk-1.0 C:/gtk/include/cairo C:/gtk/include/pixman-1 \ # C:/gtk/include C:/gtk/include/freetype2 C:/gtk/include C:/gtk/include/libpng15 \ # C:/gtk/include/gdk-pixbuf-2.0 C:/gtk/include/libpng15 C:/gtk/include/glib-2.0 \ # C:/gtk/lib/glib-2.0/include #LIBS += -LC:/gtk/lib -lgtk-3 -lgdk-3 -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lpangocairo-1.0 \ # -lpangoft2-1.0 -lfreetype -lfontconfig -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lm -latk-1.0 \ # -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl SOURCES += main.cpp HEADERS +=
#include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *label; //初始化GTK+库 gtk_init(&argc, &argv); //创建主窗口 window = gtk_window_new(GTK_WINDOW_TOPLEVEL); //设置窗口大小 gtk_widget_set_size_request(window,300,300); //设置标题 gtk_window_set_title(GTK_WINDOW (window), "Hello World"); //当窗口即将被销毁,停止主GTK+循环 g_signal_connect(window, "destroy",G_CALLBACK (gtk_main_quit), NULL); //创建一个"Hello World"标签 label = gtk_label_new("Hello, World"); //将标签加入到主窗口 gtk_container_add(GTK_CONTAINER (window), label); //设置窗口中的所有元素可见 gtk_widget_show_all(window); //开始主循环,让它在那里休息,直到应用程序关闭 gtk_main(); return 0; }