I am using and gcc-7 and mingw-w64.I want to compile a c gtk3+ program in Linux using mingw so that it will produce .exe file which can be run in windows.I am able to Compile normal c programs using mingw,But I can't compile gtk programs.I can compile gtk programs with gcc but not with mingw.

I had installed mingw as told here :- https://stackoverflow.com/questions/38786014/how-to-compile-executable-for-windows-with-gcc-with-linux-subsystem

Now I want to compile window program which I got from https://developer.gnome.org/gtk3/stable/gtk-getting-started.html#id-1.2.3.5

 smit@smit-Aspire-5742:~/programs/c programs/test$ x86_64-w64-mingw32-gcc test.c `pkg-config --cflags gtk+-3.0 --libs`
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libgtk-3.dll.a when searching for -lgtk-3
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libgtk-3.dll.a when searching for -lgtk-3
 /usr/bin/x86_64-w64-mingw32-ld: cannot find -lgtk-3
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/li /libgdk-3.dll.a when searching for -lgdk-3
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libgdk-3.dll.a when searching for -lgdk-3
 /usr/bin/x86_64-w64-mingw32-ld: cannot find -lgdk-3
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangocairo-1.0.dll.a when searching for -lpangocairo-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangocairo-1.0.lib when searching for -lpangocairo-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangocairo-1.0.dll.a when searching for -lpangocairo-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangocairo-1.0.lib when searching for -lpangocairo-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangocairo-1.0.lib when searching for -lpangocairo-1.0
 /usr/bin/x86_64-w64-mingw32-ld: cannot find -lpangocairo-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangoft2-1.0.dll.a when searching for -lpangoft2-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangoft2-1.0.lib when searching for -lpangoft2-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangoft2-1.0.dll.a when searching for -lpangoft2-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangoft2-1.0.lib when searching for -lpangoft2-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangoft2-1.0.lib when searching for -lpangoft2-1.0
 /usr/bin/x86_64-w64-mingw32-ld: cannot find -lpangoft2-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libfreetype.dll.a when searching for -lfreetype
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libfreetype.dll.a when searching for -lfreetype
 /usr/bin/x86_64-w64-mingw32-ld: cannot find -lfreetype
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libfontconfig.dll.a when searching for -lfontconfig
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/fontconfig.lib when searching for -lfontconfig
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libfontconfig.dll.a when searching for -lfontconfig
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/fontconfig.lib when searching for -lfontconfig
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/fontconfig.lib when searching for -lfontconfig
 /usr/bin/x86_64-w64-mingw32-ld: cannot find -lfontconfig
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangowin32-1.0.dll.a when searching for -lpangowin32-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangowin32-1.0.lib when searching for -lpangowin32-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpangowin32-1.0.dll.a when searching for -lpangowin32-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangowin32-1.0.lib when searching for -lpangowin32-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pangowin32-1.0.lib when searching for -lpangowin32-1.0
 /usr/bin/x86_64-w64-mingw32-ld: cannot find -lpangowin32-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpango-1.0.dll.a when searching for -lpango-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pango-1.0.lib when searching for -lpango-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libpango-1.0.dll.a when searching for -lpango-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pango-1.0.lib when searching for -lpango-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/pango-1.0.lib when searching for -lpango-1.0
 /usr/bin/x86_64-w64-mingw32-ld: cannot find -lpango-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libatk-1.0.dll.a when searching for -latk-1.0
 /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/atk-1.0.lib when searching for -latk-1.0
  /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libatk-1.0.dll.a when searching for -latk-1.0
  /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/atk-1.0.lib when searching for -latk-1.0
  /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/atk-1.0.lib when searching for -latk-1.0
  /usr/bin/x86_64-w64-mingw32-ld: cannot find -latk-1.0
  /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libcairo-gobject.dll.a when searching for -lcairo-gobject
  /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libcairo-gobject.dll.a when searching for -lcairo-gobject
  /usr/bin/x86_64-w64-mingw32-ld: cannot find -lcairo-gobject
  /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libcairo.dll.a when searching for -lcairo
  /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/cairo.lib when searching for -lcairo
  /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib/libcairo.dll.a when searching for -lcairo
  /usr/bin/x86_64-w64-mingw32-ld: skipping incompatible /opt/gtk3-dos/lib

and so .......( I am pasting the last line as this output is way more big)

 collect2: error: ld returned 1 exit status

I already went via this tutorial :-http://www.tarnyko.net/en/?q=node/45

Now vis this tutorail again but this time I had downloaded gtk+-bundle_3.6.4-20131201_win64.zip and now I am getting this output:-

 smit@smit-Aspire-5742:~/programs/c programs/test$ x86_64-w64-mingw32-gcc test.c `pkg-config --cflags gtk+-3.0 --libs`
 In file included from /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h:9:0,
             from /usr/include/glib-2.0/glib/gtypes.h:32,
             from /usr/include/glib-2.0/glib/galloca.h:32,
             from /usr/include/glib-2.0/glib.h:30,
             from /usr/include/gtk-3.0/gdk/gdkconfig.h:13,
             from /usr/include/gtk-3.0/gdk/gdk.h:30,
             from /usr/include/gtk-3.0/gtk/gtk.h:30,
             from test.c:1:
  /usr/include/glib-2.0/glib/gtypes.h: In function ‘_GLIB_CHECKED_ADD_U64’:
  /usr/include/glib-2.0/glib/gmacros.h:232:53: error: size of array ‘_GStaticAssertCompileTimeAssertion_0’ is negative
   #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
                                                 ^
   /usr/include/glib-2.0/glib/gmacros.h:229:47: note: in definition of macro ‘G_PASTE_ARGS’
   #define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
                                           ^
    /usr/include/glib-2.0/glib/gmacros.h:232:44: note: in expansion of macro ‘G_PASTE’
    #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
                                        ^
    /usr/include/glib-2.0/glib/gtypes.h:422:3: note: in expansion of macro ‘G_STATIC_ASSERT’
    G_STATIC_ASSERT(sizeof (unsigned long long) == sizeof (guint64));
       ^
    In file included from /usr/include/glib-2.0/gio/gio.h:46:0,
             from /usr/include/gtk-3.0/gdk/gdkapplaunchcontext.h:28,
             from /usr/include/gtk-3.0/gdk/gdk.h:32,
             from /usr/include/gtk-3.0/gtk/gtk.h:30,
             from test.c:1:
    /usr/include/glib-2.0/gio/gcredentials.h: At top level:
    /usr/include/glib-2.0/gio/gcredentials.h:75:1: error: unknown type name ‘uid_t’
    uid_t            g_credentials_get_unix_user      (GCredentials    *credentials,
     ^
    /usr/include/glib-2.0/gio/gcredentials.h:79:52: error: unknown type name ‘uid_t’
                                                uid_t           uid,
                                                ^
  • In the first case, where did the files in /opt/gtk3-dos/lib/ come from? In the second case, are you sure you set PKG_CONFIG_PATH appropriately (so that it finds the files for the target platform, rather than those of your host system)? – steeldriver Aug 1 '17 at 19:45
  • I don't have an answer, but the problem is that /usr/include/gtk* headers are platform dependent. I.e. to build gtk with mingw you'd need to use libs and includes from the /usr/i686-w64-mingw32/ (or wherever it is). See also this for details. – Hi-Angel Aug 1 '17 at 22:44
up vote 2 down vote accepted

I attempted to follow this tutorial 5 or maybe more times and I found what was wrong. I was extracting commands from the wrong directories and downloading the wrong version of GTK+ 3 Windows binaries.

My version of mingw is mingw64 thus I needed to download win64 version.

and I was executing command export PKG_CONFIG_PATH=/opt/gtk3-win64/lib/pkgconfig from /opt/gtk3-win64,but I needed to execute this command from the directory in which my test.c file was located.

I'll make this tutorial easy for future readers.

  1. Install mingw cross-compiler by the command:

    sudo apt-get install mingw-w64
    
  2. Download GTK+ 3 Windows binaries from here (the link in this tutorial is old, here is latest link: http://win32builder.gnome.org/). Download the appropriate version as I was downloading the wrong version. Don't make the same mistake as I did.

  3. Extract the zip file in /opt/gtkwin (recommended) by command

    sudo mkdir /opt/gtkwin && sudo unzip <name of the zip file> -d /opt/gtkwin
    
  4. Use the directory in which you have extracted the zip file. In this case I have extracted in /opt/gtkwin/ and executed the following command:

    find /opt/gtkwin -name '*.pc' -exec sudo sed -e 's@^prefix=.*@prefix=/opt/gtkwin@' -i
    
  5. Go to the directory in which you have the .c file which you which to compile and execute this command:

    export PKG_CONFIG_PATH=/opt/gtkwin/lib/pkgconfig
    
  6. Compile the program by:

    • for 64-bit:

      x86_64-w64-mingw32-gcc test.c $(pkg-config --cflags gtk+-3.0 --libs)
      
    • for 32-bit:

      i586-mingw32msvc-gcc test.c $(pkg-config --cflags --libs gtk+-3.0)
      

Also you should visit this tutorial as I had learn this from there.

This will create an .exe file which can't run in UNIX as it is targeted to run on DOS.

  • 1
    I know that I am not supposed to use comments for "+1"ing, but I have spent a great deal of time looking for this information and really appreciate your research. I wish that it supported a version of gtk+ newer than 2013, but that is fine by me at this point. – Greenbeard Jun 17 at 8:54
  • @Greenbeard It really feels nice that it helped you. I'll sleep with more peace today – noone Jun 26 at 21:05

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.