diff --git a/CMakeLists.txt b/CMakeLists.txt
index 26dec8f86e..56503f1ad5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -68,6 +68,15 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
 if (NOT MSVC)
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-attributes")
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+
+    if (MINGW)
+        add_definitions(-DMINGW_HAS_SECURE_API)
+        if (MINGW_STATIC_BUILD)
+            add_definitions(-DQT_STATICPLUGIN)
+            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
+            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
+        endif()
+    endif()
 else()
     # Silence "deprecation" warnings
     add_definitions(/D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_DEPRECATE /D_SCL_SECURE_NO_WARNINGS)
@@ -175,7 +184,7 @@ IF (APPLE)
     set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")
 ELSEIF(MINGW)
     # PSAPI is the Process Status API
-    set(PLATFORM_LIBRARIES winmm ws2_32 psapi)
+    set(PLATFORM_LIBRARIES winmm ws2_32 psapi imm32 version)
 
     # WSAPoll functionality doesn't exist before WinNT 6.x (Vista and up)
     add_definitions(-D_WIN32_WINNT=0x0600)
diff --git a/externals/microprofile/microprofile.h b/externals/microprofile/microprofile.h
index 30613b3b0a..f45c9ba82b 100644
--- a/externals/microprofile/microprofile.h
+++ b/externals/microprofile/microprofile.h
@@ -512,7 +512,7 @@ typedef int MpSocket;
 
 #ifndef _WIN32
 typedef pthread_t MicroProfileThread;
-#elif defined(_WIN32)
+#elif defined(_MSC_VER)
 typedef HANDLE MicroProfileThread;
 #else
 typedef std::thread* MicroProfileThread;
@@ -921,7 +921,7 @@ void MicroProfileThreadJoin(MicroProfileThread* pThread)
     int r = pthread_join(*pThread, 0);
     MP_ASSERT(r == 0);
 }
-#elif defined(_WIN32)
+#elif defined(_MSC_VER)
 typedef HANDLE MicroProfileThread;
 DWORD _stdcall ThreadTrampoline(void* pFunc)
 {
diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index b904fec162..99cc3f0964 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -48,6 +48,10 @@
 #include "qhexedit.h"
 #include "video_core/video_core.h"
 
+#ifdef QT_STATICPLUGIN
+Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);
+#endif
+
 GMainWindow::GMainWindow() : config(new Config()), emu_thread(nullptr) {
     Pica::g_debug_context = Pica::DebugContext::Construct();
 
diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp
index 596ae01bf1..df1008180f 100644
--- a/src/common/string_util.cpp
+++ b/src/common/string_util.cpp
@@ -11,7 +11,8 @@
 #include "common/common_paths.h"
 #include "common/logging/log.h"
 #include "common/string_util.h"
-#ifdef _MSC_VER
+
+#ifdef _WIN32
 #include <codecvt>
 #include <Windows.h>
 #include "common/common_funcs.h"
@@ -270,7 +271,7 @@ std::string ReplaceAll(std::string result, const std::string& src, const std::st
     return result;
 }
 
-#ifdef _MSC_VER
+#ifdef _WIN32
 
 std::string UTF16ToUTF8(const std::u16string& input) {
 #if _MSC_VER >= 1900
diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp
index ceb993ea15..aea43e92ba 100644
--- a/src/core/gdbstub/gdbstub.cpp
+++ b/src/core/gdbstub/gdbstub.cpp
@@ -14,7 +14,7 @@
 #include <numeric>
 #include <fcntl.h>
 
-#ifdef _MSC_VER
+#ifdef _WIN32
 #include <WinSock2.h>
 #include <common/x64/abi.h>
 #include <io.h>