diff --git a/CMakeLists.txt b/CMakeLists.txt
index d71d26cf5de7acc9402f5998f72e8228367d6947..4f3861853aaf5c0f4a372b8cf260f28ec502fee2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -43,9 +43,6 @@ option(BUILD_SHARED_LIBS "Build Shared Libraries" ON)
 if(BUILD_SHARED_LIBS)
   set (LIB_TYPE SHARED)
 else(BUILD_SHARED_LIBS)
-  if(WIN32)
-    message(WARNING "You will have to modify libaec.h for static libs.")
-  endif(WIN32)
   set(LIB_TYPE STATIC)
 endif(BUILD_SHARED_LIBS)
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ed6053ea4ea63a46dc06c766e2d5426f14b3259c..93a78f21e76f19e46f310259f2fbab2ccba3342c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,5 +1,13 @@
+include (GenerateExportHeader)
 add_library(aec ${LIB_TYPE} ${libaec_SRCS})
 set_target_properties(aec PROPERTIES VERSION 0.0.10 SOVERSION 0)
+generate_export_header(aec
+  BASE_NAME libaec
+  EXPORT_MACRO_NAME libaec_EXPORT
+  EXPORT_FILE_NAME ${PROJECT_BINARY_DIR}/libaec_Export.h
+  STATIC_DEFINE libaec_BUILT_AS_STATIC
+)
+
 add_library(sz ${LIB_TYPE} sz_compat.c)
 set_target_properties(sz PROPERTIES VERSION 2.0.1 SOVERSION 2)
 
@@ -41,7 +49,7 @@ else(WIN32)
     DESTINATION ${CMAKE_INSTALL_FULL_MANDIR}/man1 COMPONENT doc)
 endif(WIN32)
 
-install(FILES libaec.h szlib.h
+install(FILES libaec.h szlib.h ${PROJECT_BINARY_DIR}/libaec_Export.h
   DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
   COMPONENT headers)
 install(TARGETS aec_client
diff --git a/src/libaec.h b/src/libaec.h
index bb43be9a9887104ba67e3b2d9635999f39e00c37..44505e488109cc3cdb525c2a32334d63fa3d1211 100644
--- a/src/libaec.h
+++ b/src/libaec.h
@@ -52,20 +52,12 @@
 
 #include <stddef.h>
 
+#include "libaec_Export.h"
+
 #ifdef __cplusplus
 extern "C"{
 #endif
 
-#if BUILDING_LIBAEC && HAVE_VISIBILITY
-#  define LIBAEC_DLL_EXPORTED __attribute__((__visibility__("default")))
-#elif BUILDING_LIBAEC && defined _MSC_VER
-#  define LIBAEC_DLL_EXPORTED __declspec(dllexport)
-#elif defined _MSC_VER
-#  define LIBAEC_DLL_EXPORTED __declspec(dllimport)
-#else
-#  define LIBAEC_DLL_EXPORTED
-#endif
-
 struct internal_state;
 
 struct aec_stream {
@@ -155,19 +147,19 @@ struct aec_stream {
 /*********************************************/
 /* Streaming encoding and decoding functions */
 /*********************************************/
-LIBAEC_DLL_EXPORTED int aec_encode_init(struct aec_stream *strm);
-LIBAEC_DLL_EXPORTED int aec_encode(struct aec_stream *strm, int flush);
-LIBAEC_DLL_EXPORTED int aec_encode_end(struct aec_stream *strm);
+libaec_EXPORT int aec_encode_init(struct aec_stream *strm);
+libaec_EXPORT int aec_encode(struct aec_stream *strm, int flush);
+libaec_EXPORT int aec_encode_end(struct aec_stream *strm);
 
-LIBAEC_DLL_EXPORTED int aec_decode_init(struct aec_stream *strm);
-LIBAEC_DLL_EXPORTED int aec_decode(struct aec_stream *strm, int flush);
-LIBAEC_DLL_EXPORTED int aec_decode_end(struct aec_stream *strm);
+libaec_EXPORT int aec_decode_init(struct aec_stream *strm);
+libaec_EXPORT int aec_decode(struct aec_stream *strm, int flush);
+libaec_EXPORT int aec_decode_end(struct aec_stream *strm);
 
 /***************************************************************/
 /* Utility functions for encoding or decoding a memory buffer. */
 /***************************************************************/
-LIBAEC_DLL_EXPORTED int aec_buffer_encode(struct aec_stream *strm);
-LIBAEC_DLL_EXPORTED int aec_buffer_decode(struct aec_stream *strm);
+libaec_EXPORT int aec_buffer_encode(struct aec_stream *strm);
+libaec_EXPORT int aec_buffer_decode(struct aec_stream *strm);
 
 #ifdef __cplusplus
 }
diff --git a/src/szlib.h b/src/szlib.h
index 1eaa5775a15eec4cf4d3f93d7b059c89a60f5a6f..18b6a3cdfb1589b277719413abdb27cfac9aaaac 100644
--- a/src/szlib.h
+++ b/src/szlib.h
@@ -80,15 +80,15 @@ typedef struct SZ_com_t_s
     int pixels_per_scanline;
 } SZ_com_t;
 
-LIBAEC_DLL_EXPORTED int SZ_BufftoBuffCompress(
+libaec_EXPORT int SZ_BufftoBuffCompress(
     void *dest, size_t *destLen,
     const void *source, size_t sourceLen,
     SZ_com_t *param);
-LIBAEC_DLL_EXPORTED int SZ_BufftoBuffDecompress(
+libaec_EXPORT int SZ_BufftoBuffDecompress(
     void *dest, size_t *destLen,
     const void *source, size_t sourceLen,
     SZ_com_t *param);
 
-LIBAEC_DLL_EXPORTED int SZ_encoder_enabled(void);
+libaec_EXPORT int SZ_encoder_enabled(void);
 
 #endif /* SZLIB_H */