diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b7dde6384f20bb9a53d8a8cec63f15517faa3d4b..8328f34e5016f9d80817a13c45f0a907e2c33801 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -190,6 +190,9 @@ list( APPEND cdi_unknown
   resource_unpack.h
 )
 
+# Support exporting all symbolds on Windows
+set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
+
 add_library(cdilib
   ${cdi_src_files} ${cdi_unknown}
 #  INSTALL_HEADERS_LIST  cdi.h
diff --git a/src/cdi_uuid.h b/src/cdi_uuid.h
index e55d3a8959c4abd9c4393d1367ee78eddd3b4dc3..cbb3071899d9434c23eb65d195c90400b4863811 100644
--- a/src/cdi_uuid.h
+++ b/src/cdi_uuid.h
@@ -24,7 +24,9 @@ int cdiUUIDIsNull(const unsigned char uuid[])
   return isNull;
 }
 
+#ifndef _WIN32
 void cdiCreateUUID(unsigned char uuid[CDI_UUID_SIZE]);
+#endif
 
 int cdiUUID2Str(const unsigned char uuid[], char uuidstr[]);
 int cdiStr2UUID(const char *uuidstr, unsigned char uuid[]);
diff --git a/src/file.c b/src/file.c
index 2086da8a5643a461bf96f56909a7f5dba5fc8578..d38c5a2516b3955fbb13bad9f8553f82e8553b2b 100644
--- a/src/file.c
+++ b/src/file.c
@@ -10,19 +10,25 @@
 #include "config.h"
 #endif
 
-#include <unistd.h>
-
 #include <assert.h>
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <limits.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <stdbool.h>
 #include <string.h>
-#include <sys/types.h>
 #include <sys/stat.h>
+#include <sys/types.h>
+
+// On Windows, define ssize_t manually
+#ifdef _WIN32
+#define ssize_t __int64
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
 
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>  // gettimeofday()
@@ -392,7 +398,7 @@ fileFlush(int fileID)
     {
       FILE *fp = fileptr->fp;
       retval = fflush(fp);
-      if (retval == 0) retval = fsync(fileno(fp));
+      if (retval == 0) retval = fflush(fp);
       if (retval != 0) retval = errno;
     }
 
diff --git a/src/gaussian_latitudes.c b/src/gaussian_latitudes.c
index 7196999fc060af391969c8193574959dbaa89ed1..f62954c319556df722c1c02897dca50f86cf7d39 100644
--- a/src/gaussian_latitudes.c
+++ b/src/gaussian_latitudes.c
@@ -14,6 +14,9 @@
 #include <stdlib.h>
 #include <stdbool.h>
 #include <float.h>
+
+// Required on windows to be able to use M_PI
+#define _USE_MATH_DEFINES
 #include <math.h>
 
 #ifndef M_SQRT2
diff --git a/src/input_file.c b/src/input_file.c
index f34d24c483870b9a222411d7393fe42e325dda4d..11df000c99bb693605e2d3694b529d8b99287d14 100644
--- a/src/input_file.c
+++ b/src/input_file.c
@@ -19,7 +19,15 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <string.h>
+
+// On Windows, define ssize_t and pread manually
+#ifdef _WIN32
+#define ssize_t __int64
+#define pread read
+#include <io.h>
+#else
 #include <unistd.h>
+#endif
 
 #if HAVE_PTHREAD
 #include <pthread.h>
diff --git a/src/iterator_fallback.c b/src/iterator_fallback.c
index a2252bd8a39703bdc634fad595eb971b93ef6056..fd7bc6db7bc393b64ff4c1be216159d30d0abed8 100644
--- a/src/iterator_fallback.c
+++ b/src/iterator_fallback.c
@@ -19,7 +19,13 @@
 #include <assert.h>
 #include <limits.h>
 #include <stdlib.h>
+
+// On Windows, define ssize_t manually
+#ifdef _WIN32
+#define ssize_t __int64
+#else
 #include <unistd.h>
+#endif
 
 struct CdiFallbackIterator
 {
diff --git a/src/stream_cdf_i.c b/src/stream_cdf_i.c
index 708565eca2d203f3921481b4e1b13fec86ada144..3096c518c8518a88ae9114558489334cfc903126 100644
--- a/src/stream_cdf_i.c
+++ b/src/stream_cdf_i.c
@@ -6,7 +6,6 @@
 
 #include <ctype.h>
 #include <limits.h>
-#include <unistd.h>
 
 #include "dmemory.h"
 #include "cdi_int.h"
@@ -19,6 +18,13 @@
 #include "cdf_lazy_grid.h"
 #include "cdf_filter.h"
 
+// On Windows, define strcasecmp manually
+#ifdef _WIN32
+#define strcasecmp _stricmp
+#else
+#include <unistd.h>
+#endif
+
 enum VarStatus
 {
   UndefVar = -1,
diff --git a/src/util.c b/src/util.c
index 7eada35c9d6a99e63190757c9da6c3011af3e68e..df97d6a0cc6fdafd74a53c62f8848022d6c3c771 100644
--- a/src/util.c
+++ b/src/util.c
@@ -100,6 +100,7 @@ cdiUnescapeSpaces(const char *string, const char **outStringEnd)
   return result;
 }
 
+#ifndef _WIN32
 #if defined(HAVE_DECL_UUID_GENERATE) && defined(HAVE_UUID_UUID_H)
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
@@ -252,6 +253,7 @@ cdiCreateUUID(unsigned char *uuid)
 #endif
 }
 #endif
+#endif
 
 /*
  * Local Variables: