Windows系统搭建gtk-2.0开发环境教程

⌚Time: 2022-05-29 16:24:53

👨‍💻Author: Jack Ge

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程序例子并且可以查看源代码