GTK+(GIMP Toolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。
GTK+ 是一种图形用户界面(GUI)工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于 GUI 的应用程序。可以把 GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建 GUI 的许多已经准备好的构造块。
安装gtk库
gtk+ -bundle_2.24.8-20111122_win32.zip:下载地址
下载完成后解压
将其中bin目录增加到环境变量path里面,以便系统在运行gtk程序时会找到运行时依赖的动态库
使用mingw编译gtk
MinGW32:下载地址
下载完成后解压,将其中的bin目录添加到系统环境变量path中
使用记事本编辑gtk测试程序
gtktest.c
#includeint 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 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/gtk-2.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/lib/gtk-2.0/include -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/atk-1.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/cairo -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/gdk-pixbuf-2.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/pango-1.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/glib-2.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/lib/glib-2.0/include -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/freetype2 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/libpng14 -LC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl
将这些输出拷贝下来。
使用以下命令编译gtk程序,命令最后粘贴上pkg-config输出的编译链接参数
gcc gtktest.c -o a.exe -mms-bitfields -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/gtk-2.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/lib/gtk-2.0/include -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/atk-1.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/cairo -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/gdk-pixbuf-2.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/pango-1.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/glib-2.0 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/lib/glib-2.0/include -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/freetype2 -IC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/include/libpng14 -LC:/Users/m/Downloads/gtk+-bundle_2.24.10-20120208_win32/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl
运行程序
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。而这些库的后缀是.dll.a。我怀疑链接参数是不是-lxxx.dll。实际上,我发现使用pkg-config输出的参数-lxxx可以编译链接成功,而使用-lxxx.dll也可以链接成功。并且gtk是动态编译的,运行时还是需要dll文件的支撑。因此,这些.dll.a文件并不是真正的静态库文件。而是类似msvc进行动态编译时,dll文件对于的lib文件一样。
个人感觉一般libxxx.dll.a文件不是真正的静态库文件,在运行时需要xxx.dll文件的支撑。
对于这一点ffmpeg的库也是一样的
而libxxx.a格式的文件就是静态库了,程序在编译链接后可以独立运行
使用vs编译gtk
使用vs新建一个控制台项目
编辑GtkTest.cpp,输入以下代码
#includeint 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
之后确认保存,编译运行就可以了
Tips:
/share/gtk-doc/html/gtk/index.html是gtk的参考手册
/bin/gtk-demo.exe是gtk的演示程序,里面有gtk程序例子并且可以查看源代码
相关下载:
gtk±bundle_2.24.10-20120208_win32.zip
i686-4.8.4-release-win32-sjlj-rt_v3-rev0.7z



