diff --git a/config/meson.build b/config/meson.build
index 8c8b019..2090846 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -516,4 +516,24 @@ if get_option('default_library') == 'both'
  NOTE: DPDK always builds both shared and static libraries.  Please set
  "default_library" to either "static" or "shared" to select default linkage
  for apps and any examples.''')
+elif get_option('default_library') == 'shared' and is_windows and not is_ms_compiler
+    error( '''
+ Unsupported value "shared" for "default_library" option.
+
+ NOTE: DPDK Windows shared is only supported when building with MSVC. Please set
+ "default_library" to either "static" or use MSVC.''')
+endif
+
+if is_windows and not is_ms_compiler
+    is_shared_enabled=false
+else
+    is_shared_enabled=true
+endif
+
+if is_windows
+    install_static = get_option('default_library') == 'static'
+    install_shared = get_option('default_library') == 'shared'
+else
+    install_static=true
+    install_shared=true
 endif
diff --git a/drivers/meson.build b/drivers/meson.build
index 66931d4..e7cfda6 100644
--- a/drivers/meson.build
+++ b/drivers/meson.build
@@ -80,7 +80,7 @@ foreach subpath:subdirs
         subdir(class)
         skip_class = false
         foreach d:std_deps
-            if not is_variable('shared_rte_' + d)
+            if not is_variable('static_rte_' + d)
                 skip_class = true
                 reason = 'missing internal dependency, "@0@"'.format(d)
                 if dpdk_libs_deprecated.contains(d)
@@ -173,7 +173,7 @@ foreach subpath:subdirs
                 if not build
                     break
                 endif
-                if not is_variable('shared_rte_' + d)
+                if not is_variable('static_rte_' + d)
                     build = false
                     reason = 'missing internal dependency, "@0@"'.format(d)
                     if dpdk_libs_deprecated.contains(d)
@@ -188,7 +188,9 @@ foreach subpath:subdirs
                                 +'\tPlease enable missing dependency "@0@"'.format(d))
                     endif
                 else
-                    shared_deps += [get_variable('shared_rte_' + d)]
+                    if is_shared_enabled
+                        shared_deps += [get_variable('shared_rte_' + d)]
+                    endif
                     static_deps += [get_variable('static_rte_' + d)]
                 endif
             endforeach
@@ -247,7 +249,7 @@ foreach subpath:subdirs
                 include_directories: includes,
                 dependencies: static_deps,
                 c_args: cflags,
-                install: true)
+                install: install_static)
 
         # now build the shared driver
         version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), drv_path)
@@ -271,7 +273,7 @@ foreach subpath:subdirs
             endif
         endif
 
-        if is_windows
+        if is_windows and is_shared_enabled
             if is_ms_linker
                 def_file = custom_target(lib_name + '_def',
                         command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
@@ -296,30 +298,33 @@ foreach subpath:subdirs
             lk_args = ['-Wl,--version-script=' + version_map]
         endif
 
-        shared_lib = shared_library(lib_name, sources,
-                objects: objs,
-                include_directories: includes,
-                dependencies: shared_deps,
-                c_args: cflags,
-                link_args: lk_args,
-                link_depends: lk_deps,
-                version: abi_version,
-                soversion: so_version,
-                install: true,
-                install_dir: driver_install_path)
-
-        # create a dependency object and add it to the global dictionary so
-        # testpmd or other built-in apps can find it if necessary
-        shared_dep = declare_dependency(link_with: shared_lib,
-                include_directories: includes,
-                dependencies: shared_deps)
+        if is_shared_enabled
+            shared_lib = shared_library(lib_name, sources,
+                    objects: objs,
+                    include_directories: includes,
+                    dependencies: shared_deps,
+                    c_args: cflags,
+                    link_args: lk_args,
+                    link_depends: lk_deps,
+                    version: abi_version,
+                    soversion: so_version,
+                    install: install_shared,
+                    install_dir: driver_install_path)
+
+            # create a dependency object and add it to the global dictionary so
+            # testpmd or other built-in apps can find it if necessary
+            shared_dep = declare_dependency(link_with: shared_lib,
+                    include_directories: includes,
+                    dependencies: shared_deps)
+
+            set_variable('shared_@0@'.format(lib_name), shared_dep)
+        endif
         static_dep = declare_dependency(
                 include_directories: includes,
                 dependencies: static_deps)
 
         dpdk_drivers += static_lib
 
-        set_variable('shared_@0@'.format(lib_name), shared_dep)
         set_variable('static_@0@'.format(lib_name), static_dep)
         # for drivers, we only need to add dependency objects for static libs,
         # shared lib drivers are not linked in
diff --git a/drivers/net/octeontx/base/meson.build b/drivers/net/octeontx/base/meson.build
index 8e5e8c1..a793c19 100644
--- a/drivers/net/octeontx/base/meson.build
+++ b/drivers/net/octeontx/base/meson.build
@@ -10,7 +10,7 @@ sources = [
 depends = ['ethdev', 'mempool_octeontx']
 static_objs = []
 foreach d: depends
-    if not is_variable('shared_rte_' + d)
+    if not is_variable('static_rte_' + d)
         subdir_done()
     endif
     static_objs += get_variable('static_rte_' + d)
diff --git a/lib/meson.build b/lib/meson.build
index 179a272..e92ba35 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -184,7 +184,7 @@ foreach l:libraries
         if not build
             break
         endif
-        if not is_variable('shared_rte_' + d)
+        if not is_variable('static_rte_' + d)
             build = false
             reason = 'missing internal dependency, "@0@"'.format(d)
             if dpdk_libs_deprecated.contains(d)
@@ -197,7 +197,9 @@ foreach l:libraries
                         + '\tPlease add missing dependency "@0@" to "enable_libs" option'.format(d))
             endif
         else
-            shared_deps += [get_variable('shared_rte_' + d)]
+            if is_shared_enabled
+                shared_deps += [get_variable('shared_rte_' + d)]
+            endif
             static_deps += [get_variable('static_rte_' + d)]
         endif
     endforeach
@@ -242,7 +244,7 @@ foreach l:libraries
             c_args: cflags,
             dependencies: static_deps,
             include_directories: includes,
-            install: true)
+            install: install_static)
     static_dep = declare_dependency(
             include_directories: includes,
             dependencies: static_deps)
@@ -260,35 +262,37 @@ foreach l:libraries
     version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), l)
     lk_deps = [version_map]
 
-    if is_ms_linker
-        def_file = custom_target(libname + '_def',
-                command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
-                input: version_map,
-                output: '@0@_exports.def'.format(libname))
-        lk_deps += [def_file]
-
-        if is_ms_compiler
-            lk_args = ['/def:' + def_file.full_path()]
-            if meson.version().version_compare('<0.54.0')
-                lk_args += ['/implib:lib\\librte_' + l + '.dll.a']
-            endif
-        else
-            lk_args = ['-Wl,/def:' + def_file.full_path()]
-            if meson.version().version_compare('<0.54.0')
-                lk_args += ['-Wl,/implib:lib\\librte_' + l + '.dll.a']
-            endif
-        endif
-    else
-        if is_windows
-            mingw_map = custom_target(libname + '_mingw',
+    if is_shared_enabled
+        if is_ms_linker
+            def_file = custom_target(libname + '_def',
                     command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
                     input: version_map,
-                    output: '@0@_mingw.map'.format(libname))
-            lk_deps += [mingw_map]
+                    output: '@0@_exports.def'.format(libname))
+            lk_deps += [def_file]
 
-            lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
+            if is_ms_compiler
+                lk_args = ['/def:' + def_file.full_path()]
+                if meson.version().version_compare('<0.54.0')
+                    lk_args += ['/implib:lib\\librte_' + l + '.dll.a']
+                endif
+            else
+                lk_args = ['-Wl,/def:' + def_file.full_path()]
+                if meson.version().version_compare('<0.54.0')
+                    lk_args += ['-Wl,/implib:lib\\librte_' + l + '.dll.a']
+                endif
+            endif
         else
-            lk_args = ['-Wl,--version-script=' + version_map]
+            if is_windows
+                mingw_map = custom_target(libname + '_mingw',
+                        command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],
+                        input: version_map,
+                        output: '@0@_mingw.map'.format(libname))
+                lk_deps += [mingw_map]
+
+                lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]
+            else
+                lk_args = ['-Wl,--version-script=' + version_map]
+            endif
         endif
     endif
 
@@ -304,27 +308,29 @@ foreach l:libraries
                 output: name + '.sym_chk')
     endif
 
-    shared_lib = shared_library(libname,
-            sources,
-            objects: objs,
-            c_args: cflags,
-            dependencies: shared_deps,
-            include_directories: includes,
-            link_args: lk_args,
-            link_depends: lk_deps,
-            version: abi_version,
-            soversion: so_version,
-            install: true)
-    shared_dep = declare_dependency(link_with: shared_lib,
-            include_directories: includes,
-            dependencies: shared_deps)
+    if is_shared_enabled
+        shared_lib = shared_library(libname,
+                sources,
+                objects: objs,
+                c_args: cflags,
+                dependencies: shared_deps,
+                include_directories: includes,
+                link_args: lk_args,
+                link_depends: lk_deps,
+                version: abi_version,
+                soversion: so_version,
+                install: install_shared)
+        shared_dep = declare_dependency(link_with: shared_lib,
+                include_directories: includes,
+                dependencies: shared_deps)
 
-    dpdk_libraries = [shared_lib] + dpdk_libraries
-    dpdk_static_libraries = [static_lib] + dpdk_static_libraries
+        dpdk_libraries = [shared_lib] + dpdk_libraries
+        set_variable('shared_rte_' + name, shared_dep)
+        dpdk_shared_lib_deps += shared_dep
+    endif
 
-    set_variable('shared_rte_' + name, shared_dep)
+    dpdk_static_libraries = [static_lib] + dpdk_static_libraries
     set_variable('static_rte_' + name, static_dep)
-    dpdk_shared_lib_deps += shared_dep
     dpdk_static_lib_deps += static_dep
     if developer_mode
         message('lib/@0@: Defining dependency "@1@"'.format(l, name))
