diff --git a/rpcs3/main.cpp b/rpcs3/main.cpp
new file mode 100644
index 0000000000..8666b9c49f
--- /dev/null
+++ b/rpcs3/main.cpp
@@ -0,0 +1,6 @@
+#include "rpcs3.h"
+
+int main(int argc, char** argv)
+{
+ return run_rpcs3(argc, argv);
+}
diff --git a/rpcs3/rpcs3.cpp b/rpcs3/rpcs3.cpp
index 2e9c0ecbc5..73f6984d51 100644
--- a/rpcs3/rpcs3.cpp
+++ b/rpcs3/rpcs3.cpp
@@ -526,7 +526,7 @@ void run_platform_sanity_checks()
#endif
}
-int main(int argc, char** argv)
+int run_rpcs3(int argc, char** argv)
{
#ifdef _WIN32
ULONG64 intro_cycles{};
diff --git a/rpcs3/rpcs3.h b/rpcs3/rpcs3.h
new file mode 100644
index 0000000000..2441b3c83b
--- /dev/null
+++ b/rpcs3/rpcs3.h
@@ -0,0 +1,3 @@
+#pragma once
+
+int run_rpcs3(int argc, char** argv);
diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj
index d294c69ab9..ea8f2e7342 100644
--- a/rpcs3/rpcs3.vcxproj
+++ b/rpcs3/rpcs3.vcxproj
@@ -1104,6 +1104,7 @@
.\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp
"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_CONCURRENT_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtConcurrent"
+
$(QTDIR)\bin\moc.exe;%(FullPath)
diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters
index eb32d40010..6d368a1a1f 100644
--- a/rpcs3/rpcs3.vcxproj.filters
+++ b/rpcs3/rpcs3.vcxproj.filters
@@ -1421,6 +1421,9 @@
Gui\utils
+
+ rpcs3
+