diff --git a/build.rs b/build.rs
index 912a3bf..e078f0e 100644
--- a/build.rs
+++ b/build.rs
@@ -85,6 +85,7 @@ fn flag_if_supported_with_fallbacks(config: &mut cc::Build, flags: &[&str]) {
 }
 
 fn compile_zstd() {
+    let target = env::var("TARGET").unwrap_or_default();
     let mut config = cc::Build::new();
 
     // Search the following directories for C files to add to the compilation.
@@ -164,6 +165,16 @@ fn compile_zstd() {
     // Some extra parameters
     config.include("zstd/lib/");
     config.include("zstd/lib/common");
+    if target.contains("msvc") {
+        config.include("zstd/lib/compress");
+        config.include("zstd/lib/decompress");
+        #[cfg(feature = "zdict_builder")]
+        config.include("zstd/lib/dictBuilder");
+        #[cfg(feature = "legacy")]
+        config.include("zstd/lib/legacy");
+        #[cfg(feature = "seekable")]
+        config.include("zstd/contrib/seekable_format");
+    }
     config.warnings(false);
 
     config.define("ZSTD_LIB_DEPRECATED", Some("0"));
@@ -210,7 +221,9 @@ fn compile_zstd() {
 
     // Hide symbols from resulting library,
     // so we can be used with another zstd-linking lib.
-    // See https://github.com/gyscos/zstd-rs/issues/58
-    config.flag("-fvisibility=hidden");
+    // See https://github.com/gyscos/zstd-rs/issues/58.
+    if !target.contains("msvc") {
+        config.flag("-fvisibility=hidden");
+    }
     config.define("XXH_PRIVATE_API", Some(""));
     config.define("ZSTDLIB_VISIBILITY", Some(""));
