gtk+-3.21.4 static build step in windows XP

In recent days the weather is very hot Unable to sleep properly Under the state of daze research gtk3 static compiler.
-------------------------------------------------------------------------------------------------------
build static libs
-------------------------------------------------------------------------------------------------------
export LIBFFI_CFLAGS=" -I/usr/local/lib/libffi-3.2.1/include " 
export LIBFFI_LIBS=" -lffi " 
export ZLIB_CFLAGS=-I/usr/local/include 
export ZLIB_LIBS=-lz 
export CFLAGS=" -I/usr/local/include -O2 -Wall -march=i686 -mms-bitfields -mthreads -static " 
export CPPFLAGS=" -I/usr/local/include " 
export LDFLAGS=" -L/usr/local/lib " 
export LIBS=' -lpsapi -lpng -lffi -lgdiplus -luuid -lexpat -lgdi32 -lmsimg32  -lpixman-1 -lfontconfig -lxml2 -llzma -lmswsock -lfreetype -lpng16 -lz -lharfbuzz -lharfbuzz-icu -lglib-2.0 -lws2_32 -lole32 -lwinmm -lshlwapi -lintl -liconv -lpthread '

./configure --prefix=/usr/local 
--enable-static 
--disable-shared 
--with-included-immodules=ime 
--disable-gtk-doc

GTK+ 3.21.4
===========

GDK backends:         win32
Print backends:       file lpr
Dynamic modules:      yes
Included immodules:   ime
colord support:       no
Introspection:        no
Debugging:            yes
Documentation:        no

---------------------------------------------------------------------------------------------
modify ./makefile
SRC_SUBDIRS = gdk gtk libgail-util modules demos 
---------------------------------------------------------------------------------------------
__declspec(dllexport)                    fix to -->   __attribute__((visibility ("default")))
__stdcall _export                        fix to -->   __attribute__((visibility ("default")))
define PNG_IMPEXP __declspec(dllimport)  fix to -->   define PNG_IMPEXP
__attribute__((visibility ("hidden")))   fix to -->   __attribute__((visibility ("default")))
delete all DllMain function
---------------------------------------------------------------------------------------------
gtk/gtksearchengine.c  error: expected identifier before numeric constant
---------------------------------------------------------------------------------------------
enum 
{
  HITS_ADDED,
  HITS_SUBTRACTED,
  FINISHED,
  ERROR_S,          ERROR fix to -> ERROR_S
  LAST_SIGNAL
}; 

signals[ERROR_S] =
             ^^
g_signal_emit (engine, signals[ERROR_S], 0, error_message);
                                    ^^
---------------------------------------------------------------------------------------------
gtk/gtkspinbutton.c  error: expected identifier before numeric constant
---------------------------------------------------------------------------------------------
/* Signals */
enum
{
  INPUT_S,                INPUT fix to -> INPUT_S
  OUTPUT,
  VALUE_CHANGED,
  CHANGE_VALUE,
  WRAPPED,
  LAST_SIGNAL
};

spinbutton_signals[INPUT_S] =
                        ^^
g_signal_emit (spin_button, spinbutton_signals[INPUT_S], 0, &val, &return_val);
                                                    ^^
---------------------------------------------------------------------------------------------
gtkroundedbox.c:229:3: error: 'Arc' redeclared as different kind of symbol
 } Arc;
   ^
In file included from d:msysmingwi686-w64-mingw32includewindows.h:71:0,
                 from D:/MSYS/local/include/glib-2.0/glib/glib-init.h:32,
                 from D:/MSYS/local/include/glib-2.0/glib.h:30,
                 from D:/MSYS/local/include/glib-2.0/gobject/gbinding.h:28,
                 from D:/MSYS/local/include/glib-2.0/glib-object.h:23,
                 from gtkroundedboxprivate.h:21,
                 from gtkroundedbox.c:20:
d:msysmingwi686-w64-mingw32includewingdi.h:2678:28: note: previous declaration of 'Arc' was here
   WINGDIAPI WINBOOL WINAPI Arc(HDC hdc,int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);
---------------------------------------------------------------------------------------------
gtkroundedbox.c
} Arc_L;
arc_path_hash (Arc_L *arc)
  return mem_hash ((gconstpointer)arc, sizeof (Arc_L));
arc_path_equal (Arc_L *arc1,
                Arc_L *arc2)
  Arc_L key;
  memset (&key, 0, sizeof (Arc_L));
---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------
gtk/updateiconcache.c   ->  gtk-update-icon-cache.exe
---------------------------------------------------------------------------------------------
#include <glib.h>             <-- add
#include <glib-object.h>      <-- add

int
main (int argc, char **argv)
{
  g_clock_win32_init ();      <-- add
  g_thread_win32_init ();     <-- add
  glib_init ();               <-- add
  gobj_init ();               <-- add
  gchar *path;
---------------------------------------------------------------------------------------------
gtk/queryimmodules.c   ->  gtk-query-immodules-2.0.exe
---------------------------------------------------------------------------------------------
#include <glib.h>             <-- add
#include <glib-object.h>      <-- add

int main (int argc, char **argv)
{
  g_clock_win32_init ();      <-- add
  g_thread_win32_init ();     <-- add
  glib_init ();               <-- add
  gobj_init ();               <-- add
  char *cwd;
---------------------------------------------------------------------------------------------
gtk/gtk-launch.c   ->  gtk-launch.exe
---------------------------------------------------------------------------------------------
#include <glib.h>       
#include <glib-object.h>

int
main (int argc, char *argv[])
{
  g_clock_win32_init ();
  g_thread_win32_init ();
  glib_init ();
  gobj_init ();  
---------------------------------------------------------------------------------------------
gtk/encodesymbolic.c  -> gtk-encode-symbolic-svg.exe
#include <glib.h>       
#include <glib-object.h>

int
main (int argc, char *argv[])
{
  g_clock_win32_init ();
  g_thread_win32_init ();
  glib_init ();
  gobj_init ();  
---------------------------------------------------------------------------------------------
gtk/gtk-builder-tool.c
int main (int argc, const char *argv[])
{
  g_set_prgname ("gtk-builder-tool");       fix to -> gtk_init (&argc, &argv);
  gtk_init (NULL, NULL);                    fix to -> g_set_prgname ("gtk-builder-tool");
---------------------------------------------------------------------------------------------
demosgtk-demomain.c
---------------------------------------------------------------------------------------------
int
main (int argc, char **argv)
{
  gtk_init (&argc, &argv);  <-- add
  GtkApplication *app;
---------------------------------------------------------------------------------------------
  
*********************** skip the part *******************************************************
---------------------------------------------------------------------------------------------
undefined reference to `IID_IShellLinkW'         -luuid
undefined reference to `hb_icu_script_to_script' -lharfbuzz  -lharfbuzz-icu 
undefined reference to `__gxx_personality_sj0'   -lsupc++ 
---------------------------------------------------------------------------------------------
demosgtk-demomain.c
---------------------------------------------------------------------------------------------
#include <glib.h>             <-- add
#include <glib-object.h>      <-- add

int
main (int argc, char **argv)
{
  g_clock_win32_init ();      <-- add
  g_thread_win32_init ();     <-- add
  glib_init ();               <-- add
  gobj_init ();               <-- add
  GtkWidget *window;
---------------------------------------------------------------------------------------------
gtk/gtkmarshalers.c:(.text+0xc10): multiple definition of `_gtk_marshal_OBJECT__VOID'
perf/marshalers.o:marshalers.c:(.text+0x0): first defined here
---------------------------------------------------------------------------------------------
gdkmain-win32.c:(.text+0x0): multiple definition of `DllMain@12'
gtkmain.c:(.text+0x8b0): first defined here
---------------------------------------------------------------------------------------------
  
---------------------------------------------------------------------------------------------
tests/testmultidisplay.c: In function 'main':
testmultidisplay.c:104:14: error: expected identifier or '(' before numeric constant
   GdkScreen *scr2 = NULL; /* Quiet GCC */
              ^
testmultidisplay.c:145:13: error: lvalue required as left operand of assignment
        scr2 = gdk_display_get_default_screen (dpy2);
             ^
testmultidisplay.c:176:26: warning: passing argument 1 of 'make_selection_dialog' makes pointer from integer without a cast [-Wint-conversion]
   make_selection_dialog (scr2, entry, entry2);
                          ^
GdkScreen *scr2L = NULL;     scr2 fix to -> scr2L

testmultidisplay.c:56:1: note: expected 'GdkScreen * {aka struct _GdkScreen *}' but argument is of
type 'int'
 make_selection_dialog (GdkScreen * screen,
---------------------------------------------------------------------------------------------
tests/testselection.c
---------------------------------------------------------------------------------------------
typedef enum {
  SEL_TYPE_NONE,
  APPLE_PICT,
  ATOM_L,             ATOM   fix to -> ATOM_L
  ATOM_PAIR,
  BITMAP_L,           BITMAP fix to -> BITMAP_L
  C_STRING,
*********************************************************************************************

---------------------------------------------------------------------------------------------
gtkmain.c
---------------------------------------------------------------------------------------------
static HMODULE gtk_dll = NULL;

// BOOL WINAPI
// DllMain (HINSTANCE hinstDLL,
	 // DWORD     fdwReason,
	 // LPVOID    lpvReserved)
// {
  // switch (fdwReason)
    // {
    // case DLL_PROCESS_ATTACH:
      // gtk_dll = (HMODULE) hinstDLL;
      // break;
    // }

  // return TRUE;
// }
---------------------------------------------------------------------------------------------
gdkmain-win32.c
---------------------------------------------------------------------------------------------
// int __stdcall
// DllMain (HINSTANCE hinstDLL,
	 // DWORD     dwReason,
	 // LPVOID    reserved)
// {
  // _gdk_dll_hinstance = hinstDLL;

  // return TRUE;
// }
---------------------------------------------------------------------------------------------
gdk/win32/gdkglobals-win32.c
---------------------------------------------------------------------------------------------
HINSTANCE	  _gdk_dll_hinstance = NULL;
---------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------
gtkclipboard.c:(.text+0x16b8): undefined reference to `_imp__gdk_threads_unlock'
gtkclipboard.c:(.text+0x16d1): undefined reference to `_imp__gdk_threads_lock'
---------------------------------------------------------------------------------------------
gdktypes.h
---------------------------------------------------------------------------------------------
#ifdef G_OS_WIN32
#  ifdef GDK_COMPILATION
#    define GDKVAR __declspec(dllexport)         -> __attribute__((visibility ("default")))
#  else
#    define GDKVAR extern __declspec(dllimport)  ->  define GDKVAR extern
#  endif
#else
#  define GDKVAR extern
#endif
---------------------------------------------------------------------------------------------
gtkdebug.h
gtkmain.h
gtktexttypes.h
---------------------------------------------------------------------------------------------
#ifdef G_OS_WIN32
#  ifdef GDK_COMPILATION
#    define GTKVAR __declspec(dllexport)         -> __attribute__((visibility ("default")))
#  else
#    define GTKVAR extern __declspec(dllimport)  ->  define GTKVAR extern
#  endif
#else
#  define GTKVAR extern
#endif
---------------------------------------------------------------------------------------------
gtk/gtkmain.c
---------------------------------------------------------------------------------------------
...
#include <cairo.h>           <--- add
#include <epoxy/wgl.h>       <--- add
...

void
gtk_init (int *argc, char ***argv)
{
  g_clock_win32_init ();     <--- add
  g_thread_win32_init ();    <--- add
  glib_init ();              <--- add
  gobj_init ();              <--- add
  cairo_mutex_init();        <--- add
  epoxy_init();              <--- add
  if (!gtk_init_check (argc, argv))
---------------------------------------------------------------------------------------------
void gtk_main_do_event (GdkEvent *event)
...
    case GDK_DESTROY:
      /* Unexpected GDK_DESTROY from the outside, ignore for
       * child windows, handle like a GDK_DELETE for toplevels
       */
      if (!gtk_widget_get_parent (event_widget))
        {
          g_object_ref (event_widget);
          if (!gtk_widget_event (event_widget, event) &&
              gtk_widget_get_realized (event_widget))
            gtk_widget_destroy (event_widget);
          g_object_unref (event_widget);
        }
	  cairo_mutex_finalize(); <--- add
	  epoxy_exit();           <--- add
      break;
...
---------------------------------------------------------------------------------------------
In file included from d:msysmingwi686-w64-mingw32includewindows.h:72:0,
                 from D:/MSYS/local/include/glib-2.0/glib/glib-init.h:32,
                 from D:/MSYS/local/include/glib-2.0/glib.h:30,
                 from ../gdk/gdkconfig.h:13,
                 from ../gdk/gdk.h:30,
                 from gtkwin32drawprivate.h:21,
                 from gtkwin32draw.c:20:
gtkwin32draw.c:162:3: error: expected identifier before '(' token
   EDGE_RAISED       = (EDGE_RAISED_OUTER | EDGE_RAISED_INNER),
   ^
gtkwin32draw.c:731:0: warning: "RGB" redefined
 #define RGB(r, g, b) { (r)/255.0, (g)/255.0, (b)/255., 1.0 }
 ^
In file included from d:msysmingwi686-w64-mingw32includewindows.h:71:0,
                 from D:/MSYS/local/include/glib-2.0/glib/glib-init.h:32,
                 from D:/MSYS/local/include/glib-2.0/glib.h:30,
                 from ../gdk/gdkconfig.h:13,
                 from ../gdk/gdk.h:30,
                 from gtkwin32drawprivate.h:21,
                 from gtkwin32draw.c:20:
d:msysmingwi686-w64-mingw32includewingdi.h:1395:0: note: this is the location of the previous definition
 #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

EDGE_RAISED fix to -> EDGE_RAISED_L
EDGE_SUNKEN fix to -> EDGE_SUNKEN_L
EDGE_ETCHED fix to -> EDGE_ETCHED_L
EDGE_BUMP   fix to -> EDGE_BUMP_L
---------------------------------------------------------------------------------------------
./.libs/libgtk-3.a(libgtk_3_la-gtkaccessibility.o):gtkaccessibility.c:(.text+0x19ba): undefined reference to `_imp__atk_misc_instance'
----------------------------------------------------------
atk/atkmisc.h
//#        define ATK_VAR extern __declspec(dllimport)
#        define ATK_VAR extern
----------------------------------------------------------
atk/config.h
// #define _ATK_EXTERN __attribute__((visibility("default"))) __declspec(dllexport) extern
#define _ATK_EXTERN __attribute__((visibility("default")))
----------------------------------------------------------
make && make install
----------------------------------------------------------
gtk/Makefile
LIBS = * -latk-1.0 <-- add
---------------------------------------------------------------------------------------------
Could not Find Dwmapi.dll Error
    Available in Windows Vista and later versions of Windows.
---------------------------------------------------------------------------------------------
Searching for 'dwm'...
gdkwin32gdkevents-win32.c(3464):    case WM_DWMCOMPOSITIONCHANGED:
gdkwin32gdkevents-win32.c(3586):      /* TODO: pass all messages to DwmDefWindowProc() first! */
gdkwin32gdkproperty-win32.c(423):          info.dwMajorVersion > 6 ||
gdkwin32gdkproperty-win32.c(424):          (info.dwMajorVersion == 6 && info.dwMinorVersion >= 2))
gdkwin32gdkscreen-win32.c(28):#include <dwmapi.h>
gdkwin32gdkscreen-win32.c(359):  /* On Windows 8 and later, DWM (composition) is always enabled */
gdkwin32gdkscreen-win32.c(452):      if (DwmIsCompositionEnabled (&is_composited) != S_OK)
gdkwin32gdkwindow-win32.c(44):#include <dwmapi.h>
gdkwin32gdkwindow-win32.c(452):  DWM_BLURBEHIND blur_behind;
gdkwin32gdkwindow-win32.c(488):  blur_behind.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
gdkwin32gdkwindow-win32.c(491):  call_result = DwmEnableBlurBehindWindow (thiswindow, &blur_behind);
gdkwin32gdkwindow-win32.c(495):        G_STRLOC, "DwmEnableBlurBehindWindow", thiswindow, (guint32) call_result);
12 occurrence(s) have been found.
---------------------------------------------------------------------------------------------
gdkwin32gdkevents-win32.c(3464)
//    case WM_DWMCOMPOSITIONCHANGED:
//      _gdk_win32_window_enable_transparency (window);
//      break;

gdkwin32gdkproperty-win32.c(424)
//      if (!GetVersionEx (&info) ||
//          info.dwMajorVersion > 6 ||
//          (info.dwMajorVersion == 6 && info.dwMinorVersion >= 2))
//        return FALSE;

gdkwin32gdkscreen-win32.c(28)
//#include <dwmapi.h>

gdkwin32gdkscreen-win32.c(452)
//if (DwmIsCompositionEnabled (&is_composited) != S_OK)
//  return FALSE;
	  
gdkwin32gdkwindow-win32.c(44)
//#include <dwmapi.h>

gdkwin32gdkwindow-win32.c(452)
//DWM_BLURBEHIND blur_behind;

gdkwin32gdkwindow-win32.c(488)
//memset (&blur_behind, 0, sizeof (blur_behind));
//blur_behind.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
//blur_behind.hRgnBlur = empty_region;
//blur_behind.fEnable = TRUE;
//call_result = DwmEnableBlurBehindWindow (thiswindow, &blur_behind);

gdkwin32gdkwindow-win32.c(495)
//  if (!SUCCEEDED (call_result))
//    g_warning ("%s: %s (%p) failed: %" G_GINT32_MODIFIER "x",
//        G_STRLOC, "DwmEnableBlurBehindWindow", thiswindow, (guint32) call_result);

make
---------------------------------------------------------------------------------------------
SetupDiGetDevicePropertyW SETUPAPI.dll error  
    Available in Windows Vista and later versions of Windows.
---------------------------------------------------------------------------------------------
gdkwin32gdkmonitor-win32.c(188)
static gboolean
get_device_property (HDEVINFO          device_infoset,
                     SP_DEVINFO_DATA  *device_info_data,
                     DEVPROPKEY       *property_key,
                     gpointer         *r_buffer,
                     gsize            *r_buffer_size,
                     DEVPROPTYPE      *r_property_type,
                     GError          **error)
{
/*
  DEVPROPTYPE property_type;
  gpointer property;
  DWORD property_size;

  property = NULL;
  property_size = 0;

  if (!SetupDiGetDevicePropertyW (device_infoset,
                                  device_info_data,
                                  property_key,
                                  &property_type,
                                  property,
                                  property_size,
                                  &property_size,
                                  0))
    {
      DWORD error_code = GetLastError ();

      if (error_code != ERROR_INSUFFICIENT_BUFFER)
        {
          gchar *emsg = g_win32_error_message (error_code);
          g_warning ("Failed to get device node property {" G_GUID_FORMAT "},%lu size: %s",
                     g_format_guid (&property_key->fmtid),
                     property_key->pid,
                     emsg);
          g_free (emsg);

          return FALSE;
        }
    }

  if (r_buffer)
    {
      property = g_malloc (property_size);

      if (!SetupDiGetDevicePropertyW (device_infoset,
                                      device_info_data,
                                      property_key,
                                      &property_type,
                                      property,
                                      property_size,
                                      &property_size,
                                      0))
        {
          DWORD error_code = GetLastError ();

          gchar *emsg = g_win32_error_message (error_code);
          g_warning ("Failed to get device node property {" G_GUID_FORMAT "},%lu: %s",
                     g_format_guid (&property_key->fmtid),
                     property_key->pid,
                     emsg);
          g_free (emsg);

          return FALSE;
        }

      *r_buffer = property;
    }

  if (r_buffer_size)
    *r_buffer_size = property_size;

  if (r_property_type)
    *r_property_type = property_type;  */
  return TRUE;
}
---------------------------------------------------------------------------------------------
SHCreateItemFromParsingName SHELL32.dll error
    Windows Vista [desktop apps only]
---------------------------------------------------------------------------------------------
gtkgtkfilechoosernativewin32.c(371)
//  hr = SHCreateItemFromParsingName(uri_w, 0, &IID_IShellItem, (LPVOID *) &item);
//  if (SUCCEEDED (hr))
//    return item;
//  else
//    g_warning_hr ("Can't create shell item from shortcut", hr);
---------------------------------------------------------------------------------------------
D:MSYSuildlibs-2GTK_-3~1.4demosgtk-demoGTK3-D~1.EXE Missing entry: g_win32_run_session_bus@16

gio/gdbusaddress.c
------------------------
	  //res = CreateProcessW (rundll_path, args,
	  //			0, 0, FALSE,
	  //			NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW | DETACHED_PROCESS,
	  //			0, NULL /* TODO: Should be root */,
	  //			&si, &pi);
          hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_win32_run_session_bus, NULL,0,&ThreadID);
	  if(hThread)
	  {
		g_print ("g_win32_run_session_bus thread run.
");
	        address = read_shm (DBUS_DAEMON_ADDRESS_INFO);
	  }
	  else
	  {
		g_print ("g_win32_run_session_bus thread create false.
");
	  }

---------------------------------------------------------------------------------------------
tests/testheightforwidth.c
typedef struct {
  const gchar *name;
  const gchar *tooltip;
  const gchar *interface_M;  <-
  GtkWidget   *window;
} TestInterface;

static void
test_clicked (GtkWidget     *button, 
	      TestInterface *interface_L) <-
---------------------------------------------------------------------------------------------
gdkwin32gdkwindow-win32.c
---------------------------------------------------------------------------------------------
  /* Don't use UpdateLayeredWindow on minimized windows */
  Line 4935 API_CALL (UpdateLayeredWindow, (GDK_WINDOW_HWND (window), NULL,
  fix to 
  UpdateLayeredWindow, (GDK_WINDOW_HWND (window), NULL,
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
*** Warning: This system cannot link to static lib archive /gdk/libgdk-win32-2.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libpangocairo-1.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libpangowin32-1.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libpangoft2-1.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libpango-1.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libgthread-2.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libatk-1.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libcairo.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libpixman-1.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libfontconfig.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libxml2.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/liblzma.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libgdk_pixbuf-2.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libgio-2.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libgmodule-2.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libgobject-2.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libglib-2.0.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libffi.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libintl.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libiconv.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libharfbuzz-icu.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libharfbuzz.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libfreetype.la.
*** Warning: This system cannot link to static lib archive /usr/local/lib/libpng16.la.
*** Warning: This system cannot link to static lib archive d:/msys/mingw/lib/libsupc++.la.
---------------------------------------------------------------------------------------------


Conclusion: in XP system, the performance of gtk3 is very poor.
原文地址:https://www.cnblogs.com/nlsoft/p/5767132.html