mingw吧 关注:1,424贴子:4,659
  • 17回复贴,共1

msys2下的gtk3配置和编译(纯手动参数展示)

只看楼主收藏回复

好久没写点东西。因为最近多次的被度娘封号,所以实在是没心情。
今天值班没事,顺便写点,不知道会不会被再次封号


IP属地:江苏1楼2018-06-30 09:45回复
    首先装好msys2,这个没什么可说的,
    然后用命令pacman -S mingw-w64-i686-gtk3
    装上gtk3


    IP属地:江苏2楼2018-06-30 09:48
    收起回复
      从百度随便找了个gtk 的hello.c作编译例:
      #include <gtk/gtk.h>
      static void print_hello (GtkWidget *widget,
      gpointer data)
      {
      g_print ("Hello World\n");
      }
      static gboolean on_delete_event (GtkWidget *widget,
      GdkEvent *event,
      gpointer data)
      {
      g_print ("delete event occurred\n");
      return TRUE;
      }
      int main (int argc, char *argv[])
      {
      GtkWidget *window;
      GtkWidget *button;
      gtk_init (&argc, &argv);
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title (GTK_WINDOW (window), "Hello");
      g_signal_connect (window, "delete-event", G_CALLBACK (on_delete_event), NULL);
      g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
      gtk_container_set_border_width (GTK_CONTAINER (window), 10);
      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 (window), button);
      gtk_widget_show (button);
      gtk_widget_show (window);
      gtk_main ();
      return 0;
      }


      IP属地:江苏3楼2018-06-30 09:50
      收起回复
        随便输入个编译命令gcc hello.c开始编译
        这时开始报错,什么缺少gtk/gtk.h啦,啥glib.h啦。根据报错提示把所有include路径加上
        加完以下的路径终于没路径报错了
        -I/f/msys32/mingw32/include/gtk-3.0 -I/f/msys32/mingw32/include/glib-2.0 -I/f/msys32/mingw32/lib/glib-2.0/include -I/f/msys32/mingw32/include/pango-1.0 -I/f/msys32/mingw32/include/cairo -I/f/msys32/mingw32/include/gdk-pixbuf-2.0 -I/f/msys32/mingw32/include/atk-1.0
        注意以上路径是msys2中的linux路径写法。如果以后想纯用mingw64编译注意win下路径的不同格式


        IP属地:江苏4楼2018-06-30 09:54
        收起回复
          头文件加完之后因为没链接库文件,所以开始各种函数未定义报错。我们可以用notepad++打开随便一个lib文件夹下的.a文件,然后选择在文件查找该函数名,这样可以找到含有该函数名的库。
          当然了你可以百度函数名,但是我不得不说百度常找不到,而且远没有我的方法快。(这是个偷懒的办法,等学会了gtk自然知道函数所属库)
          加上调用的库 -L/f/msys32/mingw32/lib -lgtk-3 -lglib-2.0 -lgdk-3 -lcairo -latk-1.0 -lpango-1.0 -lgobject-2.0
          别忘记指定程序入口为窗体程序 -mwindows


          IP属地:江苏5楼2018-06-30 10:03
          回复(1)
            编译生成exe后,运行时会有点麻烦。提示缺少各种dll文件。
            解决方法之一,把msys2下的mingw/bin目录和user/bin目录加入系统的环境变量。
            其实我更喜欢这个笨方法,点击hello.exe然后看报错,把缺少的dll 一个个复制过来,当然这种事干一次就好了,基本上也了解了gtk文件调用了哪些动态库。当然了你也可以用dll文件依赖工具检查一下dll的依赖关系,集成包用有这工具。
            最后会发现gtk在win下的运行依赖可真是不少,一个hello.c有20M


            IP属地:江苏7楼2018-06-30 10:15
            回复
              msys2的用法基本上就是轻型的archlinx
              当熟悉了msys2后,可以很轻松的使用archlinux.
              当然了archlinux安装有点麻烦,我第一次安装时看着官方文档用了快一小时才基本能用(还不包括后期花了很多时间配置)
              所以还是推荐archlinux的一个发行版manjaro.我在虚拟机上安装只要十几分钟就进桌面,加上基本编译环境配置好也就两小时不到。


              IP属地:江苏8楼2018-06-30 10:20
              回复
                发现好象还缺少点说明
                手动编译可以帮助了解库的关系。
                如果要用pkg-config的话注意msys2下有三个,它们对应的.pc文件各不相同。
                注意别用一般不用msys下的,而是用mingw32/bin或mingw64/bin的
                下面是一个编译x32位程序的例子,编译上面hello.c的
                gcc hello.c -o hello `i686-w64-mingw32-pkg-config --cflags --libs gtk+-3.0 `


                IP属地:江苏9楼2018-06-30 14:29
                回复
                  这吧就几个活人


                  IP属地:北京10楼2018-07-25 00:49
                  收起回复



                    IP属地:广东11楼2018-12-06 11:31
                    收起回复


                      IP属地:广东12楼2018-12-06 11:33
                      回复(1)