偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.
全部博文(1751)
分类: Windows平台
2017-04-05 15:03:48
软件和包下载步骤:
首先安装dev-cpp,安装过程跟以前一样。基本不需要什么繁琐的配置,第一次运行的时候会让用户选择主题。然后接着询问是否需要缓存一些头文件,一般选择是。
GTK+3文件夹里面的include包简直天花乱坠,人工配置费时费力,而且失败几率极高!有时候根本无法判断到底是自己程序写错了,还是编译器搞错了。这时候就得用到pkg-config包管理器。这个包管理器的作用就是根据各个包的配置文件,帮助编译器生成配置命令。同样在bin目录下,输入命令:pkg-config --cflags gtk+-3.0,就会发现返回了这么多东西:
-mms-bitfields -ID:/gtkdir/include/gtk-3.0 -ID:/gtkdir/include/cairo -ID:/gtkdir
/include/pango-1.0 -ID:/gtkdir/include/atk-1.0 -ID:/gtkdir/include/cairo -ID:/gt
kdir/include/pixman-1 -ID:/gtkdir/include -ID:/gtkdir/include/freetype2 -ID:/gtk
dir/include -ID:/gtkdir/include/libpng15 -ID:/gtkdir/include/gdk-pixbuf-2.0 -ID:
/gtkdir/include/libpng15 -ID:/gtkdir/include/glib-2.0 -ID:/gtkdir/lib/glib-2.0/i
nclude
这时候用范围选取,小心翼翼地把他们复制到记事本里,这就是dev-cpp编译gtk时候所需要的编译命令,用于包含正确目录的头文件,非常重要。而且这时候也非常容易犯个低级失误,从dos提示符复制文本到记事本的时候,傻逼dos自动帮你分行了,你还得一个一个地去合并:
-mms-bitfields -ID:/gtkdir/include/gtk-3.0 -ID:/gtkdir/include/cairo -ID:/gtkdir/include/pango-1.0 -ID:/gtkdir/include/atk-1.0 -ID:/gtkdir/include/cairo -ID:/gtkdir/include/pixman-1 -ID:/gtkdir/include -ID:/gtkdir/include/freetype2 -ID:/gtkdir/include -ID:/gtkdir/include/libpng15 -ID:/gtkdir/include/gdk-pixbuf-2.0 -ID:/gtkdir/include/libpng15 -ID:/gtkdir/include/glib-2.0 -ID:/gtkdir/lib/glib-2.0/include
而且更加悲剧的是,由于不同目录长度分行的不同,容易导致漏掉空格。之前编译就出过死活找不到glib.h这个文件的bug,折腾半天,最后原因居然是 -ID:/gtkdir/include/glib-2.0-ID:/gtkdir/lib/glib-2.0/include这条语句-ID之间的空格居然没了,一看dos提示符,输出命令的时候glib-2.0在倒数第二行末尾,-ID在行首,于是dos直接给你把空格去掉了,简直悲剧。
这些命令复制到哪里呢?你可以在工具里面的编译器选项里面添加,也可以在project里面添加。因为每个工程不一样,用不用到gtk库不一定,所以我选择在工程里面添加。
把生成的-ID一堆的命令,复制到如图所示的C compiler和C++ compiler里面。至于之后的Linker里面的命令,则是用pkg-config包这样调出来:pkg-config --libs gtk+-3.0(同样在gtk的bin文件夹里面输入)
到此即可编译运行了。但是运行完各种提示确实DLL,怎么办?
进到gtk\bin文件夹,将里面所有的dll文件全部复制到你生成exe的目录里面
#include
//my first gtk program
static void print_hello(GtkWidget *widget, gpointer data){
g_print ("Hello World\n");
}
static void activate (GtkApplication *app, gpointer user_data){
GtkWidget *window;
GtkWidget *button;
GtkWidget *button_box;
window = gtk_application_window_new (app);
gtk_window_set_title (GTK_WINDOW (window), "Window");
gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
gtk_container_add (GTK_CONTAINER (window), button_box);
button = gtk_button_new_with_label ("Hello World");
g_signal_connect (button, "clicked" , G_CALLBACK (print_hello), NULL);
g_signal_connect_swapped (button, "clicked" , G_CALLBACK (gtk_widget_destroy), window);
gtk_container_add (GTK_CONTAINER (button_box), button);
gtk_widget_show_all (window);
}
int main(int argc, char **argv){
GtkApplication *app;
int status;
app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
status = g_application_run (G_APPLICATION (app), argc, argv);
g_object_unref (app);
return status;
}