diff --git a/nt/inc/ms-w32.h b/nt/inc/ms-w32.h
index d1534336c49..b4eb5622242 100644
--- a/nt/inc/ms-w32.h
+++ b/nt/inc/ms-w32.h
@@ -146,6 +146,7 @@ extern char *getenv ();
in its system headers, and is not really compatible with values
lower than 0x0500, so leave it alone. */
#ifndef MINGW_W64
+# undef _WIN32_WINNT
# define _WIN32_WINNT 0x0400
#endif
diff --git a/nt/inc/sys/stat.h b/nt/inc/sys/stat.h
index 45bc2ea1e0c..ea14f075471 100644
--- a/nt/inc/sys/stat.h
+++ b/nt/inc/sys/stat.h
@@ -30,6 +30,14 @@ along with GNU Emacs. If not, see . */
# define __MINGW_NOTHROW
#endif
+/* Prevent the MinGW stat.h header from being included, ever. */
+#ifndef _SYS_STAT_H
+# define _SYS_STAT_H
+#endif
+#ifndef _INC_STAT_H
+# define _INC_STAT_H
+#endif
+
#include
#include
diff --git a/src/image.c b/src/image.c
index a85d5149e7e..78539d91d2b 100644
--- a/src/image.c
+++ b/src/image.c
@@ -8994,10 +8994,27 @@ svg_image_p (Lisp_Object object)
return fmt[SVG_FILE].count + fmt[SVG_DATA].count == 1;
}
+/* Some versions of glib's gatomic.h define MemoryBarrier, but MinGW
+ w32api 3.18 and later has its own definition. The following gross
+ hack avoids the clash. */
+# ifdef WINDOWSNT
+# if (__W32API_MAJOR_VERSION + (__W32API_MINOR_VERSION >= 18)) >= 4
+# define W32_SAVE_MINGW_VERSION __MINGW_MAJOR_VERSION
+# undef __MINGW_MAJOR_VERSION
+# define __MINGW_MAJOR_VERSION 4
+# endif
+# endif
+
# include
# ifdef WINDOWSNT
+# ifdef W32_SAVE_MINGW_VERSION
+# undef __MINGW_MAJOR_VERSION
+# define __MINGW_MAJOR_VERSION W32_SAVE_MINGW_VERSION
+# undef W32_SAVE_MINGW_VERSION
+# endif
+
/* SVG library functions. */
DEF_DLL_FN (RsvgHandle *, rsvg_handle_new, (void));
DEF_DLL_FN (void, rsvg_handle_get_dimensions,