
GTK+(GIMP Toolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。
GTK+ 是一种图形用户界面(GUI)工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于 GUI 的应用程序。可以把 GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建 GUI 的许多已经准备好的构造块。
安装gtk库
gtk+ -bundle_2.24.8-20111122_win32.zip:https://download.gnome.org/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.8-20111122_win32.zip
下载完成后解压
将其中bin目录增加到环境变量path里面,以便系统在运行gtk程序时会找到运行时依赖的动态库

使用mingw编译gtk
MinGW-64 32位:https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/
下载完成后解压,将其中的bin目录添加到系统环境变量path中

使用记事本编辑gtk测试程序
gtktest.c
#include<gtk/gtk.h>
int main(int argc,char* argv[]){
GtkWidget* window;
GtkWidget* label;
gtk_init(&argc,&argv);
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"hello world");
gtk_window_set_default_size(GTK_WINDOW(window),300,200);
label=gtk_label_new("hello world!!");
gtk_container_add(GTK_CONTAINER(window),label);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
使用pkg-config命令(gtk库bin目录下自带的)确定gtk+ -2.0的编译参数
pkg-config --cflags --libs gtk+-2.0
得到以下输出,它们指定了gtk程序在编译时附加的头文件目录,库文件目录以及链接到哪些库文件
-mms-bitfields -ID:/libs/gtk+-bundle-2.12.11-20080720/include/gtk-2.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/lib/gtk-2.0/include -ID:/libs/gtk+-bundle-2.12.11-20080720/include/atk-1.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/include/cairo -ID:/libs/gtk+-bundle-2.12.11-20080720/include/pango-1.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/include/glib-2.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/lib/glib-2.0/include -ID:/libs/gtk+-bundle-2.12.11-20080720/include/libpng12 -LD:/libs/gtk+-bundle-2.12.11-20080720/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl
将这些输出拷贝下来。
使用以下命令编译gtk程序,命令最后粘贴上pkg-config输出的编译链接参数
gcc gtktest.c -o a.exe -mms-bitfields -ID:/libs/gtk+-bundle-2.12.11-20080720/include/gtk-2.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/lib/gtk-2.0/include -ID:/libs/gtk+-bundle-2.12.11-20080720/include/atk-1.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/include/cairo -ID:/libs/gtk+-bundle-2.12.11-20080720/include/pango-1.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/include/glib-2.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/lib/glib-2.0/include -ID:/libs/gtk+-bundle-2.12.11-20080720/include/libpng12 -LD:/libs/gtk+-bundle-2.12.11-20080720/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl
我直接将编译参数生成一个bat文件ComplieGtk.bat
g++ %1 -mms-bitfields -ID:/libs/gtk+-bundle-2.12.11-20080720/include/gtk-2.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/lib/gtk-2.0/include -ID:/libs/gtk+-bundle-2.12.11-20080720/include/atk-1.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/include/cairo -ID:/libs/gtk+-bundle-2.12.11-20080720/include/pango-1.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/include/glib-2.0 -ID:/libs/gtk+-bundle-2.12.11-20080720/lib/glib-2.0/include -ID:/libs/gtk+-bundle-2.12.11-20080720/include/libpng12 -LD:/libs/gtk+-bundle-2.12.11-20080720/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl
编译时直接用
ComplieGtk.bat gtktest.c
运行程序
a.exe

注意的问题:
如果出现以下问题,是mingw编译器位数与gtk不兼容导致的。链接时无法调用gtk的库

编译器要使用32位mingw,如何查看mingw位数,输入以下命令
gcc -v
如果输出信息中有Target: i686-w64-mingw32,说明是32位的,如果输出信息中有Target: x86_64-w64-mingw32,则是64位mingw。
同样gtk也要下载win32版本
在运行gtk程序时,总会伴随命令提示符窗口出现,编译时加入-mwindows参数就不会有了

对于gtk的lib文件夹,有gcc链接时用到的库libxxx.dll.a

gcc的静态链接库格式一般是libxxx.a。使用pkg-config输出的参数-lxxx可以编译链接成功。实际上对于gtk库,mingw-gcc编译使用-lxxx和-lxxx.dll都可以链接成功。gtk是动态编译的,运行时还是需要dll文件的支撑。因此这些.dll.a文件并不是真正的静态库文件。而是类似msvc进行编译时,动态库对应的lib文件。
使用vs编译gtk
使用vs新建一个控制台项目

编辑GtkTest.cpp,输入以下代码
#include<gtk/gtk.h>
int main(int argc,char* argv[]){
GtkWidget* window;
GtkWidget* label;
gtk_init(&argc,&argv);
window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"hello world");
gtk_window_set_default_size(GTK_WINDOW(window),300,200);
label=gtk_label_new("hello world!!");
gtk_container_add(GTK_CONTAINER(window),label);
g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
之后点击项目,GtkTest属性,为项目添加附加包含目录,没错就是pkg-config输出的-I开头的所有参数,都需要手动进行添加

C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/gtk-2.0
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/lib/gtk-2.0/include
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/atk-1.0
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/cairo
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/gdk-pixbuf-2.0
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/pango-1.0
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/glib-2.0
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/lib/glib-2.0/include
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/freetype2
C:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/libpng14
之后添加附加库目录,也就是gtk的lib文件夹,里面包含了vs动态编译时所需要的lib文件。

添加附加依赖项,是gtk的lib文件夹下所有的.lib文件

gtk-win32-2.0.lib
gdk-win32-2.0.lib
atk-1.0.lib
gio-2.0.lib
pangowin32-1.0.lib
gdi32.lib
pangocairo-1.0.lib
gdk_pixbuf-2.0.lib
pango-1.0.lib
cairo.lib
gobject-2.0.lib
gmodule-2.0.lib
gthread-2.0.lib
glib-2.0.lib
intl.lib
之后确认保存,编译运行就可以了

/share/gtk-doc/html/gtk/index.html是gtk的参考手册

/bin/gtk-demo.exe是gtk的演示程序,里面有gtk程序例子并且可以查看源代码
