diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 69705b2782ad2d0587aae26c600e9aab9146e565..79db0c62a48027e8412b7e2065764a69eab1839b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -55,8 +55,6 @@ include:
       tagname: 'FreeBSD'
       cross_platform: 'yes'
       build_flags: 'AR=/home/admin/mingw-w32/bin/i686-w64-mingw32-ar AS=/home/admin/mingw-w32/bin/i686-w64-mingw32-as CC="ccache /home/admin/mingw-w32/bin/i686-w64-mingw32-gcc" CXX="ccache /home/admin/mingw-w32/bin/i686-w64-mingw32-g++" RANLIB=/home/admin/mingw-w32/bin/i686-w64-mingw32-ranlib WINDRES=/home/admin/mingw-w32/bin/i686-w64-mingw32-windres RELEASE=1'
-      no_javascript: 'yes'
-      has_curses: 'no'
   - local: '.gitlab-ci-unix.yml'
     inputs:
       os: 'mingw-w64'
diff --git a/3rdp/build/Common.gmake b/3rdp/build/Common.gmake
index 39f997231ee05e7854b61149da483972082c2308..ca34e64aae399d80899ddce9502833c59c4eda1e 100644
--- a/3rdp/build/Common.gmake
+++ b/3rdp/build/Common.gmake
@@ -36,7 +36,9 @@ else
  endif
 endif
 
-NSPR_LDFLAGS	+=	-L/usr/local/lib -L$(NSPRDIR)
+ifndef NSPR_LIBS
+ NSPR_LDFLAGS	+=	-L/usr/local/lib -L$(NSPRDIR)
+endif
 
 ifdef NSPRINCLUDE
  NSPR_CFLAGS += -I$(NSPRINCLUDE)
@@ -133,7 +135,9 @@ else
  CRYPTLIBDIR := $(CRYPT_IDIR)
  CRYPT_DEPS := cl
  CRYPT_LIBS += $(CRYPT_IDIR)/libcl.a
- CRYPT_CFLAGS += -DSTATIC_CRYPTLIB -DSTATIC_LIB
+ ifndef win
+  CRYPT_CFLAGS += -DSTATIC_CRYPTLIB -DSTATIC_LIB
+ endif
 endif
 
 # Put it all together...
diff --git a/3rdp/build/GNUmakefile b/3rdp/build/GNUmakefile
index 3defd7ad716d0c4c144caa3029ba582564f9c7fc..ea32c040ad8d8f55fa05523d43d444a6f41c19fa 100644
--- a/3rdp/build/GNUmakefile
+++ b/3rdp/build/GNUmakefile
@@ -103,7 +103,7 @@ $(CRYPT_SRC): | $(3RDPSRCDIR)
 $(CRYPT_IDIR): | $(3RDPODIR)
 	$(QUIET)$(IFNOTEXIST) mkdir $(CRYPT_IDIR)
 
-$(CRYPTLIB_BUILD): $(3RDP_ROOT)/dist/cryptlib.zip $(3RDP_ROOT)/build/cl-fix-test-select.patch $(3RDP_ROOT)/build/cl-terminal-params.patch $(3RDP_ROOT)/build/cl-mingw32-static.patch $(3RDP_ROOT)/build/cl-ranlib.patch $(3RDP_ROOT)/build/cl-win32-noasm.patch $(3RDP_ROOT)/build/cl-zz-country.patch $(3RDP_ROOT)/build/cl-algorithms.patch $(3RDP_ROOT)/build/cl-allow-duplicate-ext.patch $(3RDP_ROOT)/build/cl-macosx-minver.patch $(3RDP_ROOT)/build/cl-posix-me-gently.patch $(3RDP_ROOT)/build/cl-PAM-noprompts.patch $(3RDP_ROOT)/build/cl-zlib.patch $(3RDP_ROOT)/build/cl-Dynamic-linked-static-lib.patch $(3RDP_ROOT)/build/cl-SSL-fix.patch $(3RDP_ROOT)/build/cl-bigger-maxattribute.patch $(3RDP_ROOT)/build/cl-endian.patch $(3RDP_ROOT)/build/cl-vcxproj.patch $(3RDP_ROOT)/build/cl-mingw-vcver.patch $(3RDP_ROOT)/build/cl-win32-build-fix.patch $(3RDP_ROOT)/build/cl-no-odbc.patch $(3RDP_ROOT)/build/cl-noasm-defines.patch $(3RDP_ROOT)/build/cl-bn-noasm64-fix.patch $(3RDP_ROOT)/build/cl-prefer-ECC.patch $(3RDP_ROOT)/build/cl-prefer-ECC-harder.patch $(3RDP_ROOT)/build/cl-clear-GCM-flag.patch $(3RDP_ROOT)/build/cl-use-ssh-ctr.patch $(3RDP_ROOT)/build/cl-ssl-suite-blocksizes.patch $(3RDP_ROOT)/build/cl-no-tpm.patch $(3RDP_ROOT)/build/cl-no-via-aes.patch $(3RDP_ROOT)/build/cl-fix-ssh-ecc-ephemeral.patch $(3RDP_ROOT)/build/cl-just-use-cc.patch $(3RDP_ROOT)/build/cl-no-safe-stack.patch $(3RDP_ROOT)/build/cl-allow-pkcs12.patch $(3RDP_ROOT)/build/cl-openbsd-threads.patch $(3RDP_ROOT)/build/cl-allow-none-auth.patch $(3RDP_ROOT)/build/cl-mingw-add-m32.patch $(3RDP_ROOT)/build/cl-poll-not-select.patch $(3RDP_ROOT)/build/cl-good-sockets.patch $(3RDP_ROOT)/build/cl-moar-objects.patch $(3RDP_ROOT)/build/cl-server-term-support.patch $(3RDP_ROOT)/build/cl-add-pubkey-attribute.patch $(3RDP_ROOT)/build/cl-allow-ssh-auth-retries.patch $(3RDP_ROOT)/build/cl-fix-ssh-channel-close.patch $(3RDP_ROOT)/build/cl-vt-lt-2005-always-defined.patch $(3RDP_ROOT)/build/cl-no-pie.patch $(3RDP_ROOT)/build/cl-no-testobjs.patch $(3RDP_ROOT)/build/cl-win32-lean-and-mean.patch $(3RDP_ROOT)/build/cl-thats-not-asm.patch $(3RDP_ROOT)/build/cl-make-channels-work.patch $(3RDP_ROOT)/build/cl-allow-ssh-2.0-go.patch $(3RDP_ROOT)/build/cl-read-timeout-every-time.patch $(3RDP_ROOT)/build/cl-allow-servercheck-pubkeys.patch $(3RDP_ROOT)/build/cl-pass-after-pubkey.patch $(3RDP_ROOT)/build/cl-ssh-list-ctr-modes.patch $(3RDP_ROOT)/build/cl-double-delete-fine-on-close.patch $(3RDP_ROOT)/build/cl-handle-unsupported-pubkey.patch $(3RDP_ROOT)/build/cl-add-patches-info.patch $(3RDP_ROOT)/build/cl-netbsd-hmac-symbol.patch $(3RDP_ROOT)/build/cl-netbsd-no-getfsstat.patch GNUmakefile $(3RDP_ROOT)/build/cl-remove-march.patch $(3RDP_ROOT)/build/cl-fix-shell-exec-types.patch $(3RDP_ROOT)/build/cl-ssh-eof-half-close.patch $(3RDP_ROOT)/build/cl-add-win64.patch $(3RDP_ROOT)/build/cl-fix-mb-w-conv-warnings.patch $(3RDP_ROOT)/build/cl-fix-ssh-header-read.patch $(3RDP_ROOT)/build/cl-ssh-service-type-for-channel.patch $(3RDP_ROOT)/build/cl-ssh-sbbs-id-string.patch $(3RDP_ROOT)/build/cl-channel-select-both.patch $(3RDP_ROOT)/build/cl-allow-none-auth-svr.patch $(3RDP_ROOT)/build/cl-quote-cc.patch | $(CRYPT_SRC) $(CRYPT_IDIR)
+$(CRYPTLIB_BUILD): $(3RDP_ROOT)/dist/cryptlib.zip $(3RDP_ROOT)/build/cl-fix-test-select.patch $(3RDP_ROOT)/build/cl-terminal-params.patch $(3RDP_ROOT)/build/cl-mingw32-static.patch $(3RDP_ROOT)/build/cl-ranlib.patch $(3RDP_ROOT)/build/cl-win32-noasm.patch $(3RDP_ROOT)/build/cl-zz-country.patch $(3RDP_ROOT)/build/cl-algorithms.patch $(3RDP_ROOT)/build/cl-allow-duplicate-ext.patch $(3RDP_ROOT)/build/cl-macosx-minver.patch $(3RDP_ROOT)/build/cl-posix-me-gently.patch $(3RDP_ROOT)/build/cl-PAM-noprompts.patch $(3RDP_ROOT)/build/cl-zlib.patch $(3RDP_ROOT)/build/cl-Dynamic-linked-static-lib.patch $(3RDP_ROOT)/build/cl-SSL-fix.patch $(3RDP_ROOT)/build/cl-bigger-maxattribute.patch $(3RDP_ROOT)/build/cl-endian.patch $(3RDP_ROOT)/build/cl-vcxproj.patch $(3RDP_ROOT)/build/cl-mingw-vcver.patch $(3RDP_ROOT)/build/cl-win32-build-fix.patch $(3RDP_ROOT)/build/cl-no-odbc.patch $(3RDP_ROOT)/build/cl-noasm-defines.patch $(3RDP_ROOT)/build/cl-bn-noasm64-fix.patch $(3RDP_ROOT)/build/cl-prefer-ECC.patch $(3RDP_ROOT)/build/cl-prefer-ECC-harder.patch $(3RDP_ROOT)/build/cl-clear-GCM-flag.patch $(3RDP_ROOT)/build/cl-use-ssh-ctr.patch $(3RDP_ROOT)/build/cl-ssl-suite-blocksizes.patch $(3RDP_ROOT)/build/cl-no-tpm.patch $(3RDP_ROOT)/build/cl-no-via-aes.patch $(3RDP_ROOT)/build/cl-fix-ssh-ecc-ephemeral.patch $(3RDP_ROOT)/build/cl-just-use-cc.patch $(3RDP_ROOT)/build/cl-no-safe-stack.patch $(3RDP_ROOT)/build/cl-allow-pkcs12.patch $(3RDP_ROOT)/build/cl-openbsd-threads.patch $(3RDP_ROOT)/build/cl-allow-none-auth.patch $(3RDP_ROOT)/build/cl-mingw-add-m32.patch $(3RDP_ROOT)/build/cl-poll-not-select.patch $(3RDP_ROOT)/build/cl-good-sockets.patch $(3RDP_ROOT)/build/cl-moar-objects.patch $(3RDP_ROOT)/build/cl-server-term-support.patch $(3RDP_ROOT)/build/cl-add-pubkey-attribute.patch $(3RDP_ROOT)/build/cl-allow-ssh-auth-retries.patch $(3RDP_ROOT)/build/cl-fix-ssh-channel-close.patch $(3RDP_ROOT)/build/cl-vt-lt-2005-always-defined.patch $(3RDP_ROOT)/build/cl-no-pie.patch $(3RDP_ROOT)/build/cl-no-testobjs.patch $(3RDP_ROOT)/build/cl-win32-lean-and-mean.patch $(3RDP_ROOT)/build/cl-thats-not-asm.patch $(3RDP_ROOT)/build/cl-make-channels-work.patch $(3RDP_ROOT)/build/cl-allow-ssh-2.0-go.patch $(3RDP_ROOT)/build/cl-read-timeout-every-time.patch $(3RDP_ROOT)/build/cl-allow-servercheck-pubkeys.patch $(3RDP_ROOT)/build/cl-pass-after-pubkey.patch $(3RDP_ROOT)/build/cl-ssh-list-ctr-modes.patch $(3RDP_ROOT)/build/cl-double-delete-fine-on-close.patch $(3RDP_ROOT)/build/cl-handle-unsupported-pubkey.patch $(3RDP_ROOT)/build/cl-add-patches-info.patch $(3RDP_ROOT)/build/cl-netbsd-hmac-symbol.patch $(3RDP_ROOT)/build/cl-netbsd-no-getfsstat.patch GNUmakefile $(3RDP_ROOT)/build/cl-remove-march.patch $(3RDP_ROOT)/build/cl-fix-shell-exec-types.patch $(3RDP_ROOT)/build/cl-ssh-eof-half-close.patch $(3RDP_ROOT)/build/cl-add-win64.patch $(3RDP_ROOT)/build/cl-fix-mb-w-conv-warnings.patch $(3RDP_ROOT)/build/cl-fix-ssh-header-read.patch $(3RDP_ROOT)/build/cl-ssh-service-type-for-channel.patch $(3RDP_ROOT)/build/cl-ssh-sbbs-id-string.patch $(3RDP_ROOT)/build/cl-channel-select-both.patch $(3RDP_ROOT)/build/cl-allow-none-auth-svr.patch $(3RDP_ROOT)/build/cl-quote-cc.patch $(3RDP_ROOT)/build/cl-mingw32-no-pragma-warning.patch $(3RDP_ROOT)/build/cl-win32-dynamic-linkage.patch $(3RDP_ROOT)/build/cl-limits.patch | $(CRYPT_SRC) $(CRYPT_IDIR)
 	@echo Creating $@ ...
 	$(QUIET)-rm -rf $(CRYPT_SRC)/*
 	$(QUIET)unzip -oa $(3RDPDISTDIR)/cryptlib.zip -d $(CRYPT_SRC)
@@ -178,6 +178,9 @@ $(CRYPTLIB_BUILD): $(3RDP_ROOT)/dist/cryptlib.zip $(3RDP_ROOT)/build/cl-fix-test
 	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-channel-select-both.patch
 	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-allow-none-auth-svr.patch
 	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-quote-cc.patch
+	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-mingw32-no-pragma-warning.patch
+	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-win32-dynamic-linkage.patch
+	$(QUIET)patch -b -p0 -d $(CRYPT_SRC) < cl-limits.patch
 	$(QUIET)perl -pi.bak -e 's/^(#define CRYPTLIB_VERSION.*)$$/"$$1\n#define CRYPTLIB_PATCHES \"" . (chomp($$val = `cat cl-*.patch | if (which md5sum > \/dev\/null 2>&1); then md5sum; else md5; fi`), $$val) . "\""/e' $(CRYPT_SRC)/cryptlib.h
 	$(QUIET)sed -E -iorig 's/%%MIN_MAC_OSX_VERSION%%/${MIN_MAC_OSX_VERSION}/g' $(CRYPT_SRC)/tools/ccopts.sh
 ifdef FIXED_FIXED_SEED
diff --git a/3rdp/build/cl-limits.patch b/3rdp/build/cl-limits.patch
new file mode 100644
index 0000000000000000000000000000000000000000..bad1794ed89f3e558c661e386f4308b8b7cf1bfd
--- /dev/null
+++ b/3rdp/build/cl-limits.patch
@@ -0,0 +1,10 @@
+--- cryptlib.h.orig	2024-03-25 06:07:16.633688000 -0400
++++ cryptlib.h	2024-03-25 06:07:24.449604000 -0400
+@@ -8,6 +8,7 @@
+ #ifndef _CRYPTLIB_DEFINED
+ 
+ #define _CRYPTLIB_DEFINED
++#include <limits.h>
+ 
+ /* The current cryptlib version: 3.4.7 */
+ 
diff --git a/3rdp/build/cl-mingw32-no-pragma-warning.patch b/3rdp/build/cl-mingw32-no-pragma-warning.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e18e0adfa4656d3f05a7da146c6340cd5f6547a5
--- /dev/null
+++ b/3rdp/build/cl-mingw32-no-pragma-warning.patch
@@ -0,0 +1,23 @@
+--- cryptlib.h.orig	2024-03-25 04:19:30.935061000 -0400
++++ cryptlib.h	2024-03-25 04:20:04.604215000 -0400
+@@ -39,12 +39,14 @@
+   /* The Windows headers are riddled with errors which are turned up at 
+      warning level 4.  To deal with this we disable some of the noisier 
+ 	 ones */
+-  #pragma warning( push )
+-  #pragma warning( disable: 4255 )	/* No function prototype given */
+-  #pragma warning( disable: 4514 )	/* Unreferenced inline function has been removed */
+-  #define WIN32_LEAN_AND_MEAN
+-  #include <windows.h>
+-  #pragma warning( pop )
++  #ifndef __MINGW32__
++    #pragma warning( push )
++    #pragma warning( disable: 4255 )	/* No function prototype given */
++    #pragma warning( disable: 4514 )	/* Unreferenced inline function has been removed */
++    #define WIN32_LEAN_AND_MEAN
++    #include <windows.h>
++    #pragma warning( pop )
++  #endif
+ 
+   /* Catch use of CryptoAPI and cryptlib at the same time.  wxWidgets 
+      includes wincrypt.h by default so we undefine the conflicting values 
diff --git a/3rdp/build/cl-win32-dynamic-linkage.patch b/3rdp/build/cl-win32-dynamic-linkage.patch
new file mode 100644
index 0000000000000000000000000000000000000000..5bdaa2f52b05f47eb6800ff2501f527bf1716001
--- /dev/null
+++ b/3rdp/build/cl-win32-dynamic-linkage.patch
@@ -0,0 +1,11 @@
+--- cryptlib.h.orig	2024-03-25 05:57:10.515088000 -0400
++++ cryptlib.h	2024-03-25 05:59:23.436090000 -0400
+@@ -76,7 +76,7 @@
+    internal crypt.h or not */
+ 
+ #if ( defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || \
+-	  defined( _WIN32_WCE ) ) && !( defined( STATIC_LIB ) || defined( _SCCTK ) )
++	  defined( _WIN32_WCE ) ) && !( defined( _SCCTK ) )
+   #define C_PTR	*					/* General pointer */
+   #if defined( _WIN32_WCE )
+ 	/* Rather than relying on _UNICODE being defined (which would cause
diff --git a/src/build/Common.gmake b/src/build/Common.gmake
index a61f175a9ff2195bde06b68bd6db0cae2febab23..adb5d5e3181a56035ad9401044f3ff962a1aee77 100644
--- a/src/build/Common.gmake
+++ b/src/build/Common.gmake
@@ -297,6 +297,9 @@ else
   ifeq ($(os),darwin)	# Don't go digging for stuff on Mac, nobody knows what's up.
    CFLAGS	+=	-DHAS_INTTYPES_H
   endif
+  ifeq ($(os),win32)	# Don't go digging for stuff on Win, huge pain.
+   CFLAGS	+=	-DHAS_INTTYPES_H
+  endif
  endif
 endif
 
diff --git a/src/conio/Common.gmake b/src/conio/Common.gmake
index 31032316023453a986fdfb694b4e71a20f3efa6d..28dc4abad623e0865843b174f70fafd96e91c1ab 100644
--- a/src/conio/Common.gmake
+++ b/src/conio/Common.gmake
@@ -28,6 +28,7 @@ ifndef win
  ifeq ($(shell pkg-config ncursesw --exists && echo YES), YES)
   CIOLIB-MT_LIBS += $(shell pkg-config ncursesw --libs)
   CIOLIB-MT_CFLAGS += $(shell pkg-config ncursesw --cflags)
+  CIOLIB-MT_CFLAGS += -DCIOLIB_IMPORTS
  else
   ifdef USE_SYSTEM_CURSES
    CIOLIB-MT_LIBS		+=	$(UL_PRE)curses$(UL_SUF)
diff --git a/src/conio/GNUmakefile b/src/conio/GNUmakefile
index 75dc5708470e4944175df3ee5eaba21c28a0e380..d379704e3a53ef482dc66c654e4986dba1edb100 100644
--- a/src/conio/GNUmakefile
+++ b/src/conio/GNUmakefile
@@ -3,6 +3,8 @@ SRC_ROOT = ..
 include $(SRC_ROOT)/build/Common.gmake	# defines clean and output directory rules
 
 CFLAGS += $(XPDEV-MT_CFLAGS) $(HASH_CFLAGS) $(ENCODE_CFLAGS) $(CIOLIB-MT_CFLAGS)
+CFLAGS := $(filter-out -DCIOLIB_IMPORT,$(CFLAGS))
+CFLAGS += -DCIOLIB_EXPORTS
 VPATH = $(SRCODIR)
 
 ifdef win
@@ -10,7 +12,13 @@ ifdef win
   OBJS	+=	$(MTOBJODIR)$(DIRSEP)win32gdi$(OFILE)
   NEED_BITMAP := 1
  endif
- OBJS	+=	$(MTOBJODIR)$(DIRSEP)SDL_win32_main$(OFILE)
+ ifdef WITH_SDL
+  OBJS	+=	$(MTOBJODIR)$(DIRSEP)SDL_win32_main$(OFILE)
+ else
+  ifndef WITHOUT_GDI
+   OBJS	+=	$(MTOBJODIR)$(DIRSEP)SDL_win32_main$(OFILE)
+  endif
+ endif
  OBJS	+=	$(MTOBJODIR)$(DIRSEP)win32cio$(OFILE)
  OBJS	+=	$(MTOBJODIR)$(DIRSEP)ciolib_res$(OFILE)
 else
diff --git a/src/conio/ciolib.h b/src/conio/ciolib.h
index 233d57a4fb948120a45fbd378528610588efd214..85348e1b9c8852558bcab9b325a036941719bba8 100644
--- a/src/conio/ciolib.h
+++ b/src/conio/ciolib.h
@@ -36,10 +36,10 @@
         #if defined(CIOLIB_IMPORTS) || defined(CIOLIB_EXPORTS)
                 #if defined(CIOLIB_IMPORTS)
                         #define CIOLIBEXPORT __declspec( dllimport )
-                        #define CIOLIBEXPORTVAR __declspec( dllimport )
+                        #define CIOLIBEXPORTVAR __declspec( dllimport ) extern
                 #else
                         #define CIOLIBEXPORT __declspec( dllexport )
-                        #define CIOLIBEXPORTVAR __declspec( dllexport )
+                        #define CIOLIBEXPORTVAR __declspec( dllexport ) extern
                 #endif
         #else   /* self-contained executable */
                 #define CIOLIBEXPORT
diff --git a/src/encode/Common.make b/src/encode/Common.make
index f402765c0ffea88500b5305fc853b15317102982..2fe030f31a65a37e0770e56538826ec18a540b00 100644
--- a/src/encode/Common.make
+++ b/src/encode/Common.make
@@ -3,6 +3,6 @@
 
 ENCODE_LIB		=	$(ENCODE_SRC)$(DIRSEP)$(LIBODIR)$(DIRSEP)$(LIBPREFIX)encode$(LIBFILE)
 
-ENCODE_CFLAGS	=	-I$(ENCODE_SRC)
+ENCODE_CFLAGS	=	-I$(ENCODE_SRC) -DB64_IMPORTS -DLZH_EXPORTS
 ENCODE_LDFLAGS	=	-L$(ENCODE_SRC)$(DIRSEP)$(LIBODIR)
 ENCODE_LIBS	=	$(UL_PRE)encode$(UL_SUF)
diff --git a/src/encode/GNUmakefile b/src/encode/GNUmakefile
index 1e9287667b58f66da9e48ea58c92bd9891961f4d..97a20cafc34c044a8780d18f89118e98047dd4f7 100644
--- a/src/encode/GNUmakefile
+++ b/src/encode/GNUmakefile
@@ -8,6 +8,8 @@ SRC_ROOT ?= ..
 include $(SRC_ROOT)/build/Common.gmake	# defines clean and output directory rules
 
 CFLAGS += -I$(ENCODE_SRC) $(XPDEV_CFLAGS)
+CFLAGS := $(filter-out -DB64_IMPORTS -DLZH_IMPORTS,$(CFLAGS))
+CFLAGS += -DB64_EXPORTS -DLZH_EXPORTS
 
 # ENCODE Library Link Rule
 $(ENCODE_BUILD): $(OBJODIR) $(OBJS)
diff --git a/src/hash/Common.make b/src/hash/Common.make
index 2ca17cfa8d17d558f59c962d487e956bf47999c3..e03b032f5972ac7678f01554b2b622f134fb6792 100644
--- a/src/hash/Common.make
+++ b/src/hash/Common.make
@@ -3,6 +3,6 @@
 
 HASH_LIB		=	$(HASH_SRC)$(DIRSEP)$(LIBODIR)$(DIRSEP)$(LIBPREFIX)hash$(LIBFILE)
 
-HASH_CFLAGS	=	-I$(HASH_SRC)
+HASH_CFLAGS	=	-I$(HASH_SRC) -DMD5_EXPORTS
 HASH_LDFLAGS	=	-L$(HASH_SRC)$(DIRSEP)$(LIBODIR)
 HASH_LIBS	=	$(UL_PRE)hash$(UL_SUF)
diff --git a/src/hash/GNUmakefile b/src/hash/GNUmakefile
index e633edf8e992380b3ee6f2c66148f1280cacd773..ad46cba7cff6e4eb14a64502951fc0cfff12a1a4 100644
--- a/src/hash/GNUmakefile
+++ b/src/hash/GNUmakefile
@@ -7,7 +7,8 @@ SRC_ROOT ?= ..
 # Cross platform/compiler definitions
 include $(SRC_ROOT)/build/Common.gmake	# defines clean and output directory rules
 
-CFLAGS += -I$(HASH_SRC) $(XPDEV_CFLAGS)
+CFLAGS := $(filter-out -DMD5_IMPORTS,$(CFLAGS))
+CFLAGS += -I$(HASH_SRC) $(XPDEV_CFLAGS) -DMD5_EXPORTS
 
 # HASH Library Link Rule
 $(HASH_BUILD): $(OBJODIR) $(OBJS)
diff --git a/src/sbbs3/GNUmakefile b/src/sbbs3/GNUmakefile
index 5982cc3fa37c2adb1f2b76b04e87e726c5c2c8c7..1f40d133ee8bb906ce541631971361330fb3c63e 100644
--- a/src/sbbs3/GNUmakefile
+++ b/src/sbbs3/GNUmakefile
@@ -115,8 +115,10 @@ else
  FILE_LIBS	= -larchive
 endif
 
-include sbbsdefs.mk
-MT_CFLAGS	+=	$(SBBSDEFS) $(SFTP-MT_CFLAGS)
+CFLAGS := $(filter-out -DWRAPPER_IMPORTS -DSBBS_IMPORTS,$(CFLAGS))
+CFLAGS += -DWRAPPER_EXPORTS -DSBBS_EXPORTS -DRINGBUF_EVENT -DRINGBUF_MUTEX
+MT_CFLAGS := $(filter-out -DWRAPPER_IMPORTS -DSBBS_IMPORTS,$(MT_CFLAGS))
+MT_CFLAGS += -DWRAPPER_EXPORTS -DSBBS_EXPORTS
 
 ifndef NO_LD_RUN_PATH
  # Set up LD_RUN_PATH for run-time locating of the .so files
@@ -168,38 +170,60 @@ ifneq ($(os),darwin)
  SBBS_EXTRA_LDFLAGS += -Wl,--version-script=sbbs.version
 endif
 
-# Synchronet BBS library Link Rule
-$(SBBS): $(JS_DEPS) $(CRYPT_DEPS) $(OBJS) $(LIBS) $(EXTRA_SBBS_DEPENDS) $(ENCODE_LIB) $(HASH_LIB) $(SFTPLIB-MT) | $(LIBODIR)
-	@echo Linking $@
-	$(QUIET)$(MKSHPPLIB) $(LDFLAGS) -o $@ $(OBJS) $(SBBS_LIBS) $(SMBLIB_LIBS) $(LIBS) $(SHLIBOPTS) $(JS_LIBS) $(CRYPT_LIBS) $(ENCODE_LIBS) $(HASH_LIBS) $(XPDEV-MT_LIBS) $(FILE_LIBS) $(SFTP-MT_LIBS) $(SBBS_EXTRA_LDFLAGS)
-ifeq ($(os), netbsd)
-	paxctl +m $(SBBS)
-endif
-
-# FTP Server Link Rule
-$(FTPSRVR): $(MTOBJODIR)/ftpsrvr.o
-	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(MTOBJODIR)/ftpsrvr.o $(SHLIBOPTS) -o $@ -lsbbs
-
-# Mail Server Link Rule
-$(MAILSRVR): $(MAIL_OBJS)
-	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(MAIL_OBJS) $(SHLIBOPTS) -o $@ -lsbbs
-
-# Web Server Link Rule
-$(WEBSRVR): $(WEB_OBJS)
-	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(WEB_OBJS) $(SHLIBOPTS) -o $@ $(ENCODE_LIBS) -lsbbs $(XPDEV-MT_LIBS)
-
-# Services Link Rule
-$(SERVICES): $(SERVICE_OBJS)
-	@echo Linking $@
-	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(SERVICE_OBJS) $(SHLIBOPTS) -o $@ -lsbbs
+LIB_EXPORTS = \
+	CFLAGS="$(CFLAGS)" \
+	SBBS="$(SBBS)" \
+	QUIET="$(QUIET)" \
+	MKSHPPLIB="$(MKSHPPLIB)" \
+	LDFLAGS="$(LDFLAGS)" \
+	SBBS_LIBS="$(SBBS_LIBS)" \
+	SMBLIB_LIBS="$(SMBLIB_LIBS)" \
+	LIBS="$(LIBS)" \
+	SHLIBIPTS="$(SHLIBIPTS)" \
+	JS_LIBS="$(JS_LIBS)" \
+	CRYPT_LIBS="$(CRYPT_LIBS)" \
+	ENCODE_LIBS="$(ENCODE_LIBS)" \
+	HASH_LIBS="$(HASH_LIBS)" \
+	XPDEV-MT_LIBS="$(XPDEV-MT_LIBS)" \
+	FILE_LIBS="$(FILE_LIBS)" \
+	SFTP-MT_LIBS="$(SFTP-MT_LIBS)" \
+	SFTP-MT_CFLAGS="$(SFTP-MT_CFLAGS)" \
+	MT_CFLAGS="$(MT_CFLAGS)" \
+	SBBS_EXTRA_LDFLAGS="$(SBBS_EXTRA_LDFLAGS)" \
+	MTOBJODIR="$(MTOBJODIR)" \
+	FTPSRVR="$(FTPSRVR)" \
+	MAILSRVR="$(MAILSRVR)" \
+	WEBSRVR="$(WEBSRVR)" \
+	SERVICES="$(SERVICES)" \
+	BUILD_DEPENDS="$(BUILD_DEPENDS)" \
+	OBJODIR="$(OBJODIR)" \
+	COMPILE_MSG="$(COMPILE_MSG)" \
+	AS="$(AS)" \
+	ASFLAGS="$(ASFLAGS)" \
+	OFILE="$(OFILE)" \
+	CC="$(CC)" \
+	CCFLAGS="$(CCFLAGS)" \
+	CXX="$(CXX)"
+
+
+$(SBBS): $(JS_DEPS) $(CRYPT_DEPS) $(LIBS) $(EXTRA_SBBS_DEPENDS) $(ENCODE_LIB) $(HASH_LIB) $(SFTPLIB-MT) | $(LIBODIR)
+	$(QUIET)$(MAKE) -f sbbs.mk $(LIB_EXPORTS) OBJS="$(OBJS)" $@
+
+$(FTPSRVR):
+	$(QUIET)$(MAKE) -f ftpsrvr.mk $(LIB_EXPORTS) FTP_OBJS="$(FTP_OBJS)" $@
+
+$(MAILSRVR):
+	$(QUIET)$(MAKE) -f mailsrvr.mk $(LIB_EXPORTS) MAIL_OBJS="$(MAIL_OBJS)" $@
+
+$(WEBSRVR):
+	$(QUIET)$(MAKE) -f websrvr.mk $(LIB_EXPORTS) WEB_OBJS="$(WEB_OBJS)" $@
+
+$(SERVICES):
+	$(QUIET)$(MAKE) -f services.mk $(LIB_EXPORTS) SERVICES_OBJS="$(SERVICES_OBJS)" $@
 
 # Synchronet Console Build Rule
-$(SBBSCON): $(CON_OBJS) $(SBBS) $(FTPSRVR) $(WEBSRVR) $(MAILSRVR) $(SERVICES)
-	@echo Linking $@
-	$(QUIET)$(CXX) $(LDFLAGS) $(MT_LDFLAGS) -o $@ $(CON_OBJS) $(CON_LIBS) $(SMBLIB_LIBS) $(XPDEV-MT_LIBS)
+$(SBBSCON): $(SBBS) $(FTPSRVR) $(WEBSRVR) $(MAILSRVR) $(SERVICES)
+	$(QUIET)$(MAKE) -f sbbs.mk $(LIB_EXPORTS) CON_OBJS="$(CON_OBJS)" $@
 
 # Baja Utility
 $(BAJA): $(BAJA_OBJS) | $(EXEODIR)
@@ -254,7 +278,7 @@ $(FILELIST): $(FILELIST_OBJS) $(ENCODE_LIB) | $(EXEODIR)
 # MAKEUSER
 $(MAKEUSER): $(MAKEUSER_OBJS) | $(EXEODIR)
 	@echo Linking $@
-	$(QUIET)$(CC) $(CONSOLE_LDFLAGS) -o $@ $(MAKEUSER_OBJS) $(XPDEV_LIBS) $(SMBLIB_LIBS) $(ENCODE_LIBS) $(HASH_LIBS)
+	$(QUIET)$(CC) $(CONSOLE_LDFLAGS) -o $@ $(MAKEUSER_OBJS) $(XPDEV_LIBS) $(SMBLIB_LIBS) $(ENCODE_LIBS) $(HASH_LIBS) $(FILE_LIBS)
 
 # JSDOOR
 $(JSDOOR): $(JSDOOR_OBJS) $(XPDEV_LIB) $(ENCODE_LIB) $(HASH_LIB) $(CIOLIB-MT) | $(EXEODIR)
@@ -265,12 +289,8 @@ ifeq ($(os), netbsd)
 endif
 
 # JSEXEC
-$(JSEXEC): $(JSEXEC_OBJS) $(SBBS) $(CIOLIB-MT) | $(EXEODIR)
-	@echo Linking $@
-	$(QUIET)$(CXX) $(LDFLAGS) $(MT_LDFLAGS) -o $@ $(JSEXEC_OBJS) -lsbbs $(JS_LIBS) $(SMBLIB_LIBS) $(UIFC-MT_LIBS) $(CIOLIB-MT_LIBS) $(XPDEV-MT_LIBS)
-ifeq ($(os), netbsd)
-	paxctl +m $(JSEXEC)
-endif
+$(JSEXEC): $(SBBS) $(CIOLIB-MT) | $(EXEODIR)
+	$(QUIET)$(MAKE) -f jsexec.mk $(LIB_EXPORTS) JSEXEC_OBJS="$(JSEXEC_OBJS)" $@
 
 # ANS2ASC
 $(ANS2ASC): $(OBJODIR)/ans2asc.o $(OBJODIR)/sauce.o $(XPDEV_LIB) | $(EXEODIR)
diff --git a/src/sbbs3/dllexport.h b/src/sbbs3/dllexport.h
index 5308120b5395152b25828da774bb853f3391936f..4e5afa395d54eefd6f0ff548bf5b447fc413b4b7 100644
--- a/src/sbbs3/dllexport.h
+++ b/src/sbbs3/dllexport.h
@@ -1,7 +1,7 @@
 #ifdef DLLEXPORT
 #undef DLLEXPORT
 #endif
-#if defined(_WIN32) && ! defined(__MINGW32__)
+#if defined(_WIN32)
 	#ifdef SBBS_EXPORTS
 		#define DLLEXPORT	__declspec(dllexport)
 	#else
diff --git a/src/sbbs3/ftpsrvr.mk b/src/sbbs3/ftpsrvr.mk
new file mode 100644
index 0000000000000000000000000000000000000000..2d72debaedc38861d8225363734abb9b89d48737
--- /dev/null
+++ b/src/sbbs3/ftpsrvr.mk
@@ -0,0 +1,24 @@
+PWD	:=	$(shell /bin/pwd)
+SRC_ROOT	?=	${PWD}/..
+include $(SRC_ROOT)/build/Common.gmake
+include extdeps.mk
+vpath %.c ../comio
+
+include sbbsdefs.mk
+override CFLAGS += $(SBBSDEFS)
+override CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(CFLAGS))
+override MT_CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(MT_CFLAGS))
+override CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override MT_CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override CFLAGS := $(filter-out -DFTPSRVR_IMPORTS,$(CFLAGS))
+override CFLAGS += -DFTPSRVR_EXPORTS
+override MT_CFLAGS := $(filter-out -DFTPSRVR_IMPORTS,$(MT_CFLAGS))
+override MT_CFLAGS += -DFTPSRVR_EXPORTS
+override OBJS := 
+override MTOBJS := 
+
+# FTP Server Link Rule
+$(FTPSRVR): $(FTP_OBJS)
+	@echo Linking $@
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(FTP_OBJS) $(SHLIBOPTS) -o $@ -lsbbs $(XPDEV-MT_LIBS)
+	rm $(MTOBJODIR)/nopen$(OFILE)
diff --git a/src/sbbs3/jsdebug.h b/src/sbbs3/jsdebug.h
index 528ce9202af513a90b635277d0d0184419b2e907..b321859d8f6bc2267fb058672d629a8b32069823 100644
--- a/src/sbbs3/jsdebug.h
+++ b/src/sbbs3/jsdebug.h
@@ -2,15 +2,16 @@
 #define JSDEBUG_H
 
 #include <jsapi.h>
+#include "dllexport.h"
 
 enum debug_action {
 	DEBUG_CONTINUE,
 	DEBUG_EXIT
 };
 
-void setup_debugger(void);
-BOOL init_debugger(JSRuntime *rt, JSContext *cx,void (*puts)(const char *), char *(*getline)(void));
-enum debug_action debug_prompt(JSContext *cx, JSObject *script);
-void end_debugger(JSRuntime *rt, JSContext *cx);
+DLLEXPORT void setup_debugger(void);
+DLLEXPORT BOOL init_debugger(JSRuntime *rt, JSContext *cx,void (*puts)(const char *), char *(*getline)(void));
+DLLEXPORT enum debug_action debug_prompt(JSContext *cx, JSObject *script);
+DLLEXPORT void end_debugger(JSRuntime *rt, JSContext *cx);
 
 #endif
diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index af80f577ce4bd71c2cafb03f8f983441166d7491..a870c91b6c310bb15475ab222ae96aaea2e2db66 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -32,7 +32,8 @@
 #define STARTUP_INI_JSOPT_BITDESC_TABLE
 #include "sbbs.h"
 #include "ciolib.h"
-#if defined(main) && defined(_WIN32) && !defined(JSDOOR)
+// TODO: Whatever the MSVC build is doing to make this work should be done here too...
+#if defined(main) && defined(_WIN32) && !defined(JSDOOR) && !defined(__MINGW32__)
  #undef main	// Don't be a Windows program, be a Console one
 #endif
 #include "ini_file.h"
diff --git a/src/sbbs3/jsexec.mk b/src/sbbs3/jsexec.mk
new file mode 100644
index 0000000000000000000000000000000000000000..fb1a6995ec84c75670c48a5c0be92d4cadf4d513
--- /dev/null
+++ b/src/sbbs3/jsexec.mk
@@ -0,0 +1,22 @@
+PWD	:=	$(shell /bin/pwd)
+SRC_ROOT	?=	${PWD}/..
+include $(SRC_ROOT)/build/Common.gmake
+include extdeps.mk
+vpath %.c ../comio
+
+include sbbsdefs.mk
+override CFLAGS += $(SBBSDEFS)
+override CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(CFLAGS))
+override MT_CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(MT_CFLAGS))
+override CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override MT_CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override OBJS := 
+override MTOBJS := 
+
+# JSEXEC
+$(JSEXEC): $(JSEXEC_OBJS)
+	@echo Linking $@
+	$(QUIET)$(CXX) $(LDFLAGS) $(MT_LDFLAGS) -o $@ $(JSEXEC_OBJS) -lsbbs $(JS_LIBS) $(SMBLIB_LIBS) $(UIFC-MT_LIBS) $(CIOLIB-MT_LIBS) $(XPDEV-MT_LIBS)
+ifeq ($(os), netbsd)
+	paxctl +m $(JSEXEC)
+endif
diff --git a/src/sbbs3/mailsrvr.mk b/src/sbbs3/mailsrvr.mk
new file mode 100644
index 0000000000000000000000000000000000000000..7fb5372656830f8b4ce41ca204c002160e72ec99
--- /dev/null
+++ b/src/sbbs3/mailsrvr.mk
@@ -0,0 +1,25 @@
+PWD	:=	$(shell /bin/pwd)
+SRC_ROOT	?=	${PWD}/..
+include $(SRC_ROOT)/build/Common.gmake
+include extdeps.mk
+vpath %.c ../comio
+vpath %.c ../encode
+
+include sbbsdefs.mk
+override CFLAGS += $(SBBSDEFS)
+override CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(CFLAGS))
+override MT_CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(MT_CFLAGS))
+override CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override MT_CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override CFLAGS := $(filter-out -DMAILSRVR_IMPORTS,$(CFLAGS))
+override CFLAGS += -DMAILSRVR_EXPORTS
+override MT_CFLAGS := $(filter-out -DMAILSRVR_IMPORTS,$(MT_CFLAGS))
+override MT_CFLAGS += -DMAILSRVR_EXPORTS
+override OBJS := 
+override MTOBJS := 
+
+# Mail Server Link Rule
+$(MAILSRVR): $(MAIL_OBJS)
+	@echo Linking $@
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(MAIL_OBJS) $(SHLIBOPTS) -o $@ -lsbbs $(XPDEV-MT_LIBS)
+	rm $(MTOBJODIR)/nopen$(OFILE)
diff --git a/src/sbbs3/objects.mk b/src/sbbs3/objects.mk
index ff20d2664ebb496a80733880dd671fedc40b4280..10affe94e5a62a31dbe72ed78a20990acf5fc785 100644
--- a/src/sbbs3/objects.mk
+++ b/src/sbbs3/objects.mk
@@ -112,23 +112,26 @@ OBJS	=		$(LOAD_CFG_OBJS) \
 			$(MTOBJODIR)/ssl$(OFILE)
 
 CON_OBJS	= $(MTOBJODIR)/sbbscon$(OFILE) \
-			$(MTOBJODIR)/sbbs_ini$(OFILE)
+			$(MTOBJODIR)/sbbs_ini$(OFILE) \
+			$(MTOBJODIR)/getctrl$(OFILE)
 
 FTP_OBJS	= $(MTOBJODIR)/ftpsrvr$(OFILE) \
 			$(MTOBJODIR)/nopen$(OFILE)
 
 MAIL_OBJS	= $(MTOBJODIR)/mailsrvr$(OFILE) \
 			$(MTOBJODIR)/mxlookup$(OFILE) \
- 		  	$(MTOBJODIR)/mime$(OFILE) \
- 		  	$(MTOBJODIR)/nopen$(OFILE) \
- 		  	$(MTOBJODIR)/ars$(OFILE)
+ 			$(MTOBJODIR)/mime$(OFILE) \
+ 			$(MTOBJODIR)/nopen$(OFILE) \
+ 			$(MTOBJODIR)/ars$(OFILE) \
+ 			$(MTOBJODIR)/utf8$(OFILE)
 
 WEB_OBJS	= $(MTOBJODIR)/websrvr$(OFILE) \
 			$(MTOBJODIR)/ars$(OFILE) \
 			$(MTOBJODIR)/ringbuf$(OFILE)
 
 SERVICE_OBJS	= $(MTOBJODIR)/services$(OFILE) \
-			$(MTOBJODIR)/sbbs_ini$(OFILE)
+			$(MTOBJODIR)/sbbs_ini$(OFILE) \
+			$(MTOBJODIR)/nopen$(OFILE)
 
 BAJA_OBJS = \
 			$(OBJODIR)/baja$(OFILE) \
@@ -195,12 +198,13 @@ MAKEUSER_OBJS = 	$(LOAD_CFG_OBJS) \
 			$(OBJODIR)/userdat$(OFILE) \
 			$(OBJODIR)/trash$(OFILE) \
 			$(OBJODIR)/getstats$(OFILE) \
-			$(OBJODIR)/msgdate$(OFILE)
+			$(OBJODIR)/msgdate$(OFILE) \
 
 JSEXEC_OBJS = \
 			$(MTOBJODIR)/jsexec$(OFILE) \
 			$(MTOBJODIR)/js_uifc$(OFILE) \
-			$(MTOBJODIR)/js_conio$(OFILE)
+			$(MTOBJODIR)/js_conio$(OFILE) \
+			$(MTOBJODIR)/getctrl$(OFILE)
 
 JSDOOR_OBJS = 		$(LOAD_CFG_OBJS) \
 			$(MTOBJODIR)/date_str$(OFILE) \
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index 2ccfa79d695bcaea30fef7ff1a44acbfc182fa2d..815330ca3ceece3588ad3d7ad24a73d023d73bc6 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -1343,14 +1343,10 @@ public:
 #undef DLLEXPORT
 #endif
 #ifdef _WIN32
-	#ifdef __MINGW32__
-		#define DLLEXPORT
+	#ifdef SBBS_EXPORTS
+		#define DLLEXPORT	__declspec(dllexport)
 	#else
-		#ifdef SBBS_EXPORTS
-			#define DLLEXPORT	__declspec(dllexport)
-		#else
-			#define DLLEXPORT	__declspec(dllimport)
-		#endif
+		#define DLLEXPORT	__declspec(dllimport)
 	#endif
 #else	/* !_WIN32 */
 	#define DLLEXPORT
diff --git a/src/sbbs3/sbbs.mk b/src/sbbs3/sbbs.mk
new file mode 100644
index 0000000000000000000000000000000000000000..78bba021e1fd0594507ddf912626d35deced5e89
--- /dev/null
+++ b/src/sbbs3/sbbs.mk
@@ -0,0 +1,19 @@
+PWD	:=	$(shell /bin/pwd)
+SRC_ROOT	?=	${PWD}/..
+include $(SRC_ROOT)/build/Common.gmake
+include extdeps.mk
+vpath %.c ../comio
+
+include sbbsdefs.mk
+override CFLAGS := $(filter-out -DSBBS_IMPORTS -DWRAPPER_IMPORTS -DMD5_IMPORTS -DB64_IMPORTS,$(CFLAGS))
+override MT_CFLAGS := $(filter-out -DSBBS_IMPORTS -DWRAPPER_IMPORTS -DMD5_IMPORTS -DB64_IMPORTS,$(MT_CFLAGS))
+override CFLAGS += -DWRAPPER_EXPORTS -DB64_EXPORTS -D_CRYPT_DEFINED $(SFTP-MT_CFLAGS) $(SBBSDEFS)
+override MT_CFLAGS += -DWRAPPER_EXPORTS -DB64_EXPORTS -D_CRYPT_DEFINED
+
+# Synchronet BBS library Link Rule
+$(SBBS): $(OBJS)
+	@echo Linking $@
+	$(QUIET)$(MKSHPPLIB) $(LDFLAGS) -o $@ $(OBJS) $(SBBS_LIBS) $(SMBLIB_LIBS) $(LIBS) $(SHLIBOPTS) $(JS_LIBS) $(CRYPT_LIBS) $(ENCODE_LIBS) $(HASH_LIBS) $(XPDEV-MT_LIBS) $(FILE_LIBS) $(SFTP-MT_LIBS) $(SBBS_EXTRA_LDFLAGS)
+ifeq ($(os), netbsd)
+	paxctl +m $(SBBS)
+endif
diff --git a/src/sbbs3/sbbscon.mk b/src/sbbs3/sbbscon.mk
new file mode 100644
index 0000000000000000000000000000000000000000..4be60c7bc8aa6386d7e68d5384d23033991678eb
--- /dev/null
+++ b/src/sbbs3/sbbscon.mk
@@ -0,0 +1,19 @@
+PWD	:=	$(shell /bin/pwd)
+SRC_ROOT	?=	${PWD}/..
+include $(SRC_ROOT)/build/Common.gmake
+include extdeps.mk
+vpath %.c ../comio
+
+include sbbsdefs.mk
+override CFLAGS += $(SBBSDEFS)
+override CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(CFLAGS))
+override MT_CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(MT_CFLAGS))
+override CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override MT_CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override OBJS := 
+override MTOBJS := 
+
+# Synchronet Console Build Rule
+$(SBBSCON): $(CON_OBJS)
+	@echo Linking $@
+	$(QUIET)$(CXX) $(LDFLAGS) $(MT_LDFLAGS) -o $@ $(CON_OBJS) $(CON_LIBS) $(SMBLIB_LIBS) $(XPDEV-MT_LIBS)
diff --git a/src/sbbs3/scfg/GNUmakefile b/src/sbbs3/scfg/GNUmakefile
index 4bc15dae41b487f1372785f0550c92b21244033a..b7b493aa8ba9bb8983be73e063e757c0c3fdf107 100644
--- a/src/sbbs3/scfg/GNUmakefile
+++ b/src/sbbs3/scfg/GNUmakefile
@@ -1,7 +1,7 @@
 SRC_ROOT	?= ../..
 include ${SRC_ROOT}/build/Common.gmake
 
-CFLAGS	+=	-DSCFG -I.. -I../../comio $(CRYPT_CFLAGS) $(SMBLIB_CFLAGS) $(UIFC-MT_CFLAGS) $(CIOLIB-MT_CFLAGS) $(XPDEV-MT_CFLAGS) $(ENCODE_CFLAGS) $(HASH_CFLAGS)
+CFLAGS	+=	-DSCFG -I.. -I../../comio $(CRYPT_CFLAGS) $(SMBLIB_CFLAGS) $(UIFC-MT_CFLAGS) $(CIOLIB-MT_CFLAGS) $(XPDEV-MT_CFLAGS) $(ENCODE_CFLAGS) $(HASH_CFLAGS) -DWRAPPER_EXPORTS -DSBBS_EXPORTS -D_CRYPT_DEFINED
 LDFLAGS	+=	$(SMBLIB_LDFLAGS) $(ENCODE_LDFLAGS) $(HASH_LDFLAGS) $(UIFC-MT_LDFLAGS) $(CIOLIB-MT_LDFLAGS) $(XPDEV-MT_LDFLAGS) $(CRYPT_LDFLAGS)
 
 vpath %.c ..
diff --git a/src/sbbs3/services.mk b/src/sbbs3/services.mk
new file mode 100644
index 0000000000000000000000000000000000000000..39aef2bb1f86942833b05b8b289c32f849e65ecd
--- /dev/null
+++ b/src/sbbs3/services.mk
@@ -0,0 +1,24 @@
+PWD	:=	$(shell /bin/pwd)
+SRC_ROOT	?=	${PWD}/..
+include $(SRC_ROOT)/build/Common.gmake
+include extdeps.mk
+vpath %.c ../comio
+
+include sbbsdefs.mk
+override CFLAGS += $(SBBSDEFS)
+override CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(CFLAGS))
+override MT_CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(MT_CFLAGS))
+override CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override MT_CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override CFLAGS := $(filter-out -DSERVICES_IMPORTS,$(CFLAGS))
+override CFLAGS += -DSERVICES_EXPORTS
+override MT_CFLAGS := $(filter-out -DSERVICES_IMPORTS,$(MT_CFLAGS))
+override MT_CFLAGS += -DSERVICES_EXPORTS
+override OBJS := 
+override MTOBJS := 
+
+# Services Link Rule
+$(SERVICES): $(SERVICE_OBJS)
+	@echo Linking $@
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(SERVICE_OBJS) $(SHLIBOPTS) -o $@ -lsbbs $(XPDEV-MT_LIBS)
+	rm $(MTOBJODIR)/nopen$(OFILE)
diff --git a/src/sbbs3/sftp.cpp b/src/sbbs3/sftp.cpp
index 295de248bd540d8b62b6a94db8f0e33b93b6d84d..32db136c7ec7a70cb850823bdadc43b560d71394 100644
--- a/src/sbbs3/sftp.cpp
+++ b/src/sbbs3/sftp.cpp
@@ -518,17 +518,21 @@ sftp_attr_string(sftp_file_attr_t attr)
 		if (sftp_fattr_get_atime(attr, &u32)) {
 			struct tm t;
 			time_t tt = u32;
+#ifndef __MINGW32__
 			if (gmtime_r(&tt, &t))
 				ret << "atime=" << std::put_time(&t, "%c") << u32 << ", ";
 			else
+#endif
 				ret << "atime=" << u32 << ", ";
 		}
 		if (sftp_fattr_get_mtime(attr, &u32)) {
 			struct tm t;
 			time_t tt = u32;
+#ifndef __MINGW32__
 			if (gmtime_r(&tt, &t))
 				ret << "mtime=" << std::put_time(&t, "%c") << u32 << ", ";
 			else
+#endif
 				ret << "mtime=" << u32 << ", ";
 		}
 		u32 = sftp_fattr_get_ext_count(attr);
diff --git a/src/sbbs3/targets.mk b/src/sbbs3/targets.mk
index 0dc2782d17a58892cc706ffe79463e8c72cc9d82..37083b4d6a2ec88ac215fcc60ab76cb2123ba4ce 100644
--- a/src/sbbs3/targets.mk
+++ b/src/sbbs3/targets.mk
@@ -182,10 +182,10 @@ jsdoor: $(GIT_INFO) $(JS_DEPS) $(CRYPT_DEPS) $(XPDEV-MT_LIB) $(SMBLIB) $(UIFCLIB
 
 # Library dependencies
 $(SBBS):
-$(FTPSRVR): $(SMBLIB) 
-$(WEBSRVR):
-$(MAILSRVR):
-$(SERVICES): 
+$(FTPSRVR): $(SBBS) $(XPDEV-MT_LIB) $(SMBLIB) 
+$(WEBSRVR): $(SBBS) $(XPDEV-MT_LIB)
+$(MAILSRVR): $(SBBS) $(XPDEV-MT_LIB) $(SMBLIB)
+$(SERVICES): $(SBBS) $(XPDEV-MT_LIB)
 $(SBBSCON): $(XPDEV-MT_LIB) $(SMBLIB)
 $(SBBSMONO): $(XPDEV-MT_LIB) $(SMBLIB)
 $(JSEXEC): $(XPDEV-MT_LIB) $(SMBLIB)
diff --git a/src/sbbs3/uedit/GNUmakefile b/src/sbbs3/uedit/GNUmakefile
index 2eacd9bd338d8e32f82d4b0ae82230fd1b7cdac1..738f5acf90da95a3e2c6fc5018018454a3c3e593 100644
--- a/src/sbbs3/uedit/GNUmakefile
+++ b/src/sbbs3/uedit/GNUmakefile
@@ -22,7 +22,7 @@ endif
 
 vpath %.c ..
 
-CFLAGS	+=	-DHAS_CURSES -I.. -I../../comio $(SMBLIB_CFLAGS) $(HASH_CFLAGS) $(ENCODE_CFLAGS) $(UIFC-MT_CFLAGS) $(CIOLIB-MT_CFLAGS) $(XPDEV-MT_CFLAGS)
+CFLAGS	+=	-DHAS_CURSES -I.. -I../../comio $(SMBLIB_CFLAGS) $(HASH_CFLAGS) $(ENCODE_CFLAGS) $(UIFC-MT_CFLAGS) $(CIOLIB-MT_CFLAGS) $(XPDEV-MT_CFLAGS) -DWRAPPER_EXPORTS -DSBBS_EXPORTS -D_CRYPT_DEFINED
 LDFLAGS	+=	$(SMBLIB_LDFLAGS) $(ENCODE_LDFLAGS) $(HASH_LDFLAGS) $(UIFC-MT_LDFLAGS) $(CIOLIB-MT_LDFLAGS) $(XPDEV-MT_LDFLAGS) $(MT_LDFLAGS)
 
 $(UEDIT): $(OBJS) | $(MTOBJODIR) $(EXEODIR)
diff --git a/src/sbbs3/uedit/uedit.c b/src/sbbs3/uedit/uedit.c
index b6c7f19fe4f8ceb40db802459b7d2c6f26569521..0a0929b0c765bc0ce66ad3da3063add01bf0f465 100644
--- a/src/sbbs3/uedit/uedit.c
+++ b/src/sbbs3/uedit/uedit.c
@@ -69,7 +69,7 @@ char sepchar = 0xb3;
  * From FreeBSD src/lib/libc/string/strcasestr.c
  */
 char *
-strcasestr(const char *s, const char *find)
+uedit_strcasestr(const char *s, const char *find)
 {
 	char c, sc;
 	size_t len;
@@ -191,12 +191,12 @@ int do_cmd(char *cmd)
 {
 	int i;
 
-#ifdef HAS_CURSES
+#if defined(HAS_CURSES) && !defined(_WIN32)
 	if(cio_api.mode == CIOLIB_MODE_CURSES || cio_api.mode == CIOLIB_MODE_CURSES_IBM)
 		endwin();
 #endif
 	i=system(cmd);
-#ifdef HAS_CURSES
+#if defined(HAS_CURSES) && !defined(_WIN32)
 	if(cio_api.mode == CIOLIB_MODE_CURSES || cio_api.mode == CIOLIB_MODE_CURSES_IBM)
 		refresh();
 #endif
@@ -1703,7 +1703,7 @@ int finduser(scfg_t *cfg, user_t *user)
 		for(i=1; i<=last; i++) {
 			user->number=i;
 			GETUSERDAT(cfg,user);
-			if(strcasestr(user->alias, str)!=NULL || strcasestr(user->name, str)!=NULL || strcasestr(user->handle, str)!=NULL
+			if(uedit_strcasestr(user->alias, str)!=NULL || uedit_strcasestr(user->name, str)!=NULL || uedit_strcasestr(user->handle, str)!=NULL
 					|| user->number==un) {
 				FREE_AND_NULL(opt[j]);
 				if((opt[j]=(struct user_list *)malloc(sizeof(struct user_list)))==NULL)
@@ -1755,7 +1755,7 @@ int getuser(scfg_t *cfg, user_t *user, char* str)
 		for(i=1; i<=last; i++) {
 			user->number=i;
 			GETUSERDAT(cfg,user);
-			if(strcasestr(user->alias, str)!=NULL || strcasestr(user->name, str)!=NULL || strcasestr(user->handle, str)!=NULL) {
+			if(uedit_strcasestr(user->alias, str)!=NULL || uedit_strcasestr(user->name, str)!=NULL || uedit_strcasestr(user->handle, str)!=NULL) {
 				FREE_AND_NULL(opt[j]);
 				if((opt[j]=(struct user_list *)malloc(sizeof(struct user_list)))==NULL)
 					allocfail(sizeof(struct user_list));
diff --git a/src/sbbs3/umonitor/GNUmakefile b/src/sbbs3/umonitor/GNUmakefile
index 4502e049d2e7f76f3f0dbd7a7ae05dbf28b40afe..03f1db805901e40352948eef6d8e1225f5091de3 100644
--- a/src/sbbs3/umonitor/GNUmakefile
+++ b/src/sbbs3/umonitor/GNUmakefile
@@ -22,7 +22,7 @@ endif
 
 vpath %.c ..
 
-CFLAGS	+=	-I.. -I../../comio $(SMBLIB_CFLAGS) $(ENCODE_CFLAGS) $(HASH_CFLAGS) $(UIFC-MT_CFLAGS) $(CIOLIB-MT_CFLAGS) $(XPDEV-MT_CFLAGS)
+CFLAGS	+=	-I.. -I../../comio $(SMBLIB_CFLAGS) $(ENCODE_CFLAGS) $(HASH_CFLAGS) $(UIFC-MT_CFLAGS) $(CIOLIB-MT_CFLAGS) $(XPDEV-MT_CFLAGS) -DWRAPPER_EXPORTS -DSBBS_EXPORTS
 LDFLAGS	+=	$(SMBLIB_LDFLAGS) $(ENCODE_LDFLAGS) $(HASH_LDFLAGS) $(UIFC-MT_LDFLAGS) $(CIOLIB-MT_LDFLAGS) $(XPDEV-MT_LDFLAGS) $(MT_LDFLAGS)
 
 $(UMONITOR): $(OBJS)
diff --git a/src/sbbs3/websrvr.mk b/src/sbbs3/websrvr.mk
new file mode 100644
index 0000000000000000000000000000000000000000..9d1910158929f5fa73dd01e5a5c47dafa70f321d
--- /dev/null
+++ b/src/sbbs3/websrvr.mk
@@ -0,0 +1,21 @@
+PWD	:=	$(shell /bin/pwd)
+SRC_ROOT	?=	${PWD}/..
+include $(SRC_ROOT)/build/Common.gmake
+include extdeps.mk
+vpath %.c ../comio
+
+include sbbsdefs.mk
+override CFLAGS += $(SBBSDEFS)
+override CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(CFLAGS))
+override MT_CFLAGS := $(filter-out -DSBBS_EXPORTS -DSMB_EXPORTS -DMD5_EXPORTS -DWRAPPER_EXPORTS -DB64_EXPORTS,$(MT_CFLAGS))
+override CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override MT_CFLAGS += -DSBBS_IMPORTS -DSMB_IMPORTS -DMD5_IMPORTS -DWRAPPER_IMPORTS -DB64_IMPORTS
+override CFLAGS := $(filter-out -DWEBSRVR_IMPORTS,$(CFLAGS))
+override CFLAGS += -DWEBSRVR_EXPORTS
+override CFLAGS := $(filter-out -DWEBSRVR_IMPORTS,$(CFLAGS))
+override CFLAGS += -DWEBSRVR_EXPORTS
+
+# Web Server Link Rule
+$(WEBSRVR): $(WEB_OBJS)
+	@echo Linking $@
+	$(QUIET)$(MKSHLIB) $(LDFLAGS) $(WEB_OBJS) $(SHLIBOPTS) -o $@ $(ENCODE_LIBS) -lsbbs $(XPDEV-MT_LIBS)
diff --git a/src/smblib/GNUmakefile b/src/smblib/GNUmakefile
index cac443a6fbff66a5382e66f78c672077422f7d8a..446b2f80b8573d8c799d67f4aac92b1ca95d3935 100644
--- a/src/smblib/GNUmakefile
+++ b/src/smblib/GNUmakefile
@@ -18,7 +18,8 @@ SRC_ROOT = ..
 include $(SRC_ROOT)/build/Common.gmake	# defines clean and output directory rules
 
 CFLAGS += -I$(XPDEV_SRC) $(ENCODE_CFLAGS) $(HASH_CFLAGS) $(XPDEV_CFLAGS)
-
+CFLAGS := $(filter-out -DSMB_IMPORTS -DMD5_IMPORTS -DB64_IMPORTS,$(CFLAGS))
+CFLAGS += -DSMB_EXPORTS -DMD5_EXPORTS -DB64_EXPORTS
 
 # SMBLIB Library Link Rule
 $(SMBLIB_BUILD): $(OBJS) | $(OBJODIR)
diff --git a/src/syncterm/GNUmakefile b/src/syncterm/GNUmakefile
index 538f93a47e6c6b13a0091d68683686fe356e5417..835ab170cb94877dcdab16e945a2df9d90369311 100644
--- a/src/syncterm/GNUmakefile
+++ b/src/syncterm/GNUmakefile
@@ -28,7 +28,7 @@ ifdef WITHOUT_CRYPTLIB
 else
  OBJS += $(MTOBJODIR)$(DIRSEP)ssh$(OFILE)
  OBJS += $(MTOBJODIR)$(DIRSEP)telnets$(OFILE)
- CFLAGS	+=	$(CRYPT_CFLAGS) $(SFTP-MT_CFLAGS)
+ CFLAGS	+=	$(CRYPT_CFLAGS) $(SFTP-MT_CFLAGS) -D_CRYPT_DEFINED
  CRYPT_LDFLAGS += $(SFTP-MT_LDFLAGS)
  EXTRA_LIBS	+=	$(CRYPT_LIBS) $(SFTP-MT_LIBS)
  STATIC_CRYPTLIB	:= true
@@ -61,6 +61,8 @@ CFLAGS	+=	-DSYSTEM_LIST_DIR=\"${SYSTEM_LIST_DIR}\"
 
 CFLAGS	+=	$(UIFC-MT_CFLAGS) $(CIOLIB-MT_CFLAGS) $(XPDEV-MT_CFLAGS) $(ENCODE_CFLAGS) $(HASH_CFLAGS) -I../sbbs3 -I../comio
 LDFLAGS	+=	$(UIFC-MT_LDFLAGS) $(CIOLIB-MT_LDFLAGS) $(XPDEV-MT_LDFLAGS) $(ENCODE_LDFLAGS) $(HASH_LDFLAGS) $(CRYPT_LDFLAGS)
+CFLAGS	:=	$(filter-out -DB64_IMPORTS,$(CFLAGS))
+CFLAGS	+=	-DB64_EXPORTS -DCIOLIB_EXPORTS
 
 vpath %.c ../sbbs3 ../uifc ../comio
 
diff --git a/src/xpdev/Common.gmake b/src/xpdev/Common.gmake
index 1ce8175ab51082d20ce77406092e2a227991c784..8195169100e4c73e4ac81195dfa92a9b3010b079 100644
--- a/src/xpdev/Common.gmake
+++ b/src/xpdev/Common.gmake
@@ -29,8 +29,12 @@ ifeq ($(os),linux)	# Linux
  XPDEV-MT_LIBS	+=	-lpthread
 endif
 ifdef win		# MinGW32
- XPDEV_LIBS	+=	-lws2_32 -lwinmm -lnetapi32 -liphlpapi
- XPDEV-MT_LIBS	+=	-lws2_32 -lwinmm -lnetapi32 -liphlpapi
+ XPDEV_LIBS	 +=	-lws2_32 -lwinmm -lnetapi32 -liphlpapi
+ XPDEV-MT_LIBS	 +=	-lws2_32 -lwinmm -lnetapi32 -liphlpapi
+ XPDEV_CFLAGS +=      -DWRAPPER_EXPORTS
+ XPDEV-MT_CFLAGS +=      -DWRAPPER_EXPORTS
+ XPDEV_LIBS	+=	$(XPDEV_SRC)$(DIRSEP)$(MTOBJODIR)$(DIRSEP)xpmap$(OFILE)
+ XPDEV-MT_LIBS	+=	$(XPDEV_SRC)$(DIRSEP)$(MTOBJODIR)$(DIRSEP)xpmap$(OFILE)
 endif
 ifndef win
  ifeq ($(shell if [ -c /dev/urandom ] ; then echo YES ; fi),YES)
@@ -188,13 +192,15 @@ X_PRESENT	= $(shell if [ ! \( -f $(X_HEADERS)$(DIRSEP)X11$(DIRSEP)Xlib.h -a -f $
 ifeq ($(X_PRESENT),NO)
  NO_X=1
 else
- ifeq ($(os),darwin)	# No X11 for OSX
-  ifndef HAS_DLOPEN
-   NO_X=1
+ ifneq ($(os),win32)
+  ifeq ($(os),darwin)	# No X11 for OSX
+   ifndef HAS_DLOPEN
+    NO_X=1
+   endif
   endif
+  XPDEV-MT_CFLAGS	+=	-I$(X_HEADERS)
+  XPDEV_CFLAGS	+=	-I$(X_HEADERS)
  endif
- XPDEV-MT_CFLAGS	+=	-I$(X_HEADERS)
- XPDEV_CFLAGS	+=	-I$(X_HEADERS)
 endif
 
 ifndef WITHOUT_PORTAUDIO
diff --git a/src/xpdev/GNUmakefile b/src/xpdev/GNUmakefile
index ed119f58e4b5597393312b4ee952b7a62eeb28b9..a909140e287e99480c1e35b07c6fe26b3e0e675a 100644
--- a/src/xpdev/GNUmakefile
+++ b/src/xpdev/GNUmakefile
@@ -15,13 +15,18 @@ ifndef NO_PULSEAUDIO
  endif
 endif
 
-CFLAGS	+=	-DSOUNDCARD_H_IN=$(shell if [ -f /usr/include/sys/soundcard.h ] ; then echo 1 ; elif [ -f /usr/include/soundcard.h ] ; then echo 2 ; elif [ -f /usr/include/linux/soundcard.h ] ; then echo 3 ; else echo 0 ; fi) -I. $(XPDEV_CFLAGS)
+ifneq ($(os),win32)
+ CFLAGS	+=	-DSOUNDCARD_H_IN=$(shell if [ -f /usr/include/sys/soundcard.h ] ; then echo 1 ; elif [ -f /usr/include/soundcard.h ] ; then echo 2 ; elif [ -f /usr/include/linux/soundcard.h ] ; then echo 3 ; else echo 0 ; fi) -I. $(XPDEV_CFLAGS)
+endif
 ifndef WITHOUT_ALSA_SOUND
 	ifeq ($(shell if [ -f /usr/include/alsa/asoundlib.h ] ; then echo YES ; fi),YES)
 		CFLAGS	+=	-DUSE_ALSA_SOUND
 	endif
 endif
-MT_CFLAGS	+=	$(XPDEV-MT_CFLAGS)
+CFLAGS := $(filter-out -DWRAPPER_IMPORTS,$(CFLAGS))
+MT_CFLAGS += $(XPDEV-MT_CFLAGS)
+MT_CFLAGS := $(filter-out -DWRAPPER_IMPORTS,$(MT_CFLAGS))
+MT_CFLAGS += -DWRAPPER_EXPORTS
 
 ifdef WITH_SDL_AUDIO
  MTOBJS	+=	$(MTOBJODIR)$(DIRSEP)sdlfuncs$(OFILE)
diff --git a/src/xpdev/genwrap.h b/src/xpdev/genwrap.h
index d07d86962765313c854e881b0069027fceb842db..26f3b0454b54a3a7067dfa8b418bcc3ec531dec0 100644
--- a/src/xpdev/genwrap.h
+++ b/src/xpdev/genwrap.h
@@ -259,8 +259,8 @@ extern "C" {
 #endif
 
 #if defined(NEEDS_STRLCPY)
-	size_t strlcpy(char *dst, const char *src, size_t size);
-	size_t strlcat(char *dst, const char *src, size_t dstsize);
+	DLLEXPORT size_t strlcpy(char *dst, const char *src, size_t size);
+	DLLEXPORT size_t strlcat(char *dst, const char *src, size_t dstsize);
 #endif
 
 #if defined(_WIN32)