diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6d890eb27da7de3435af787c5ef6309669b48197..592255ab75e190ce537581c08b7ca7851d1315c8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -220,6 +220,10 @@ if(MSVC)
       endif(${VAR} MATCHES "/MD")
     endforeach(VAR)
   endif(ENABLE_MSVC_STATIC_RUNTIME)
+  if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
+    # automatically export .def file (requires CMake 3.4)
+    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+  endif(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
 endif(MSVC)
 
 if(ENABLE_OPENMP)
@@ -1519,9 +1523,6 @@ if(WIN32 AND NOT MSVC OR CYGWIN)
 elseif(MSVC)
   set_target_properties(gmsh PROPERTIES LINK_FLAGS
     "/STACK:16777216 /SAFESEH:NO")
-  if(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
-    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
-  endif(ENABLE_BUILD_DYNAMIC OR ENABLE_BUILD_SHARED)
 endif(WIN32 AND NOT MSVC OR CYGWIN)
 
 # parser target