diff --git a/meson.build b/meson.build
index 6e1c867..4016033 100644
--- a/meson.build
+++ b/meson.build
@@ -3293,6 +3293,12 @@ frontend_shlib_code = declare_dependency(
   dependencies: [shlib_code, os_deps, libintl],
 )
 
+if get_option('default_library') == 'shared'
+  frontend_lib_code = frontend_shlib_code
+else
+  frontend_lib_code = frontend_stlib_code
+endif
+
 # For frontend code that doesn't use fe_utils - this mainly exists for libpq's
 # tests, which are defined before fe_utils is defined, as fe_utils depends on
 # libpq.
@@ -3326,7 +3332,7 @@ subdir('src/interfaces/libpq-oauth')
 # for frontend binaries
 frontend_code = declare_dependency(
   include_directories: [postgres_inc],
-  link_with: [fe_utils, common_static, pgport_static],
+  link_with: [fe_utils, common_default, pgport_default],
   sources: generated_headers,
   dependencies: [os_deps, libintl],
 )
diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build
index 06958e3..a25abd1 100644
--- a/src/bin/initdb/meson.build
+++ b/src/bin/initdb/meson.build
@@ -20,7 +20,7 @@ initdb = executable('initdb',
   # from libpq, else we have risks of version skew if we run with a libpq
   # shared library from a different PG version.  Define
   # USE_PRIVATE_ENCODING_FUNCS to ensure that that happens.
-  c_args: ['-DUSE_PRIVATE_ENCODING_FUNCS'],
+  # But vcpkg cannot build the libs with this definition.
   dependencies: [frontend_code, libpq, icu, icu_i18n],
   kwargs: default_bin_args,
 )
diff --git a/src/bin/pg_combinebackup/meson.build b/src/bin/pg_combinebackup/meson.build
index bbc4c57..9ea8597 100644
--- a/src/bin/pg_combinebackup/meson.build
+++ b/src/bin/pg_combinebackup/meson.build
@@ -17,7 +17,7 @@ endif
 
 pg_combinebackup = executable('pg_combinebackup',
   pg_combinebackup_sources,
-  dependencies: [frontend_code],
+  dependencies: [frontend_code, libpq],
   kwargs: default_bin_args,
 )
 bin_targets += pg_combinebackup
diff --git a/src/common/meson.build b/src/common/meson.build
index 1540ba6..e29d594 100644
--- a/src/common/meson.build
+++ b/src/common/meson.build
@@ -114,6 +114,8 @@ common_sources_frontend_shlib += files(
 )
 
 common_sources_excluded_shlib = files(
+)
+common_sources_frontend_shlib += files(
   'fe_memutils.c',
   'logging.c',
 )
@@ -144,7 +146,7 @@ pgcommon_variants = {
     'dependencies': [frontend_common_code],
     # Files in libpgcommon.a should use/export the "xxx_private" versions
     # of pg_char_to_encoding() and friends.
-    'c_args': ['-DUSE_PRIVATE_ENCODING_FUNCS'],
+    # But vcpkg's static library linkage must not add the private suffix
   },
   '_shlib': default_lib_args + {
     'pic': true,
@@ -159,6 +161,19 @@ pgcommon_variants = {
 
 foreach name, opts : pgcommon_variants
 
+  if name == '_srv'
+    pgcommon += {name: disabler()}
+    continue
+  endif
+  if name == '' and get_option('default_library') == 'shared'
+    pgcommon += {name: disabler()}
+    continue
+  endif
+  if name == '_shlib' and get_option('default_library') == 'static'
+    pgcommon += {name: disabler()}
+    continue
+  endif
+
   # Build internal static libraries for sets of files that need to be built
   # with different cflags
   cflag_libs = []
@@ -195,6 +210,7 @@ foreach name, opts : pgcommon_variants
       }
     )
   pgcommon += {name: lib}
+  common_default = lib
 endforeach
 
 common_srv = pgcommon['_srv']
diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build
index 56e0a21..e3c8675 100644
--- a/src/interfaces/ecpg/compatlib/meson.build
+++ b/src/interfaces/ecpg/compatlib/meson.build
@@ -41,11 +41,17 @@ ecpg_compat_so = shared_library('libecpg_compat',
 )
 ecpg_targets += ecpg_compat_so
 
+if get_option('default_library') == 'shared'
+  ecpg_compat_libraries = ecpg_compat_so
+else
+  ecpg_compat_libraries = ecpg_compat_st
+endif
+
 pkgconfig.generate(
   name: 'libecpg_compat',
   description: 'PostgreSQL libecpg_compat library',
   url: pg_url,
-  libraries: ecpg_compat_so,
-  libraries_private: [frontend_stlib_code, thread_dep],
+  libraries: ecpg_compat_libraries,
+  libraries_private: [frontend_lib_code, thread_dep],
   requires_private: ['libecpg', 'libpgtypes'],
 )
diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build
index 8f478c6..fbae057 100644
--- a/src/interfaces/ecpg/ecpglib/meson.build
+++ b/src/interfaces/ecpg/ecpglib/meson.build
@@ -52,12 +52,18 @@ ecpglib_so = shared_library('libecpg',
 )
 ecpg_targets += ecpglib_so
 
+if get_option('default_library') == 'shared'
+  ecpglib_libraries = ecpglib_so
+else
+  ecpglib_libraries = ecpglib_st
+endif
+
 pkgconfig.generate(
   name: 'libecpg',
   description: 'PostgreSQL libecpg library',
   url: pg_url,
-  libraries: ecpglib_so,
-  libraries_private: [frontend_stlib_code, thread_dep],
+  libraries: ecpglib_libraries,
+  libraries_private: [frontend_lib_code, thread_dep],
   requires_private: ['libpgtypes', 'libpq'],
 )
 
diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build
index 02301ec..e695b98 100644
--- a/src/interfaces/ecpg/pgtypeslib/meson.build
+++ b/src/interfaces/ecpg/pgtypeslib/meson.build
@@ -46,10 +46,16 @@ ecpg_pgtypes_so = shared_library('libpgtypes',
 )
 ecpg_targets += ecpg_pgtypes_so
 
+if get_option('default_library') == 'shared'
+  ecpg_pgtypes_libraries = ecpg_pgtypes_so
+else
+  ecpg_pgtypes_libraries = ecpg_pgtypes_st
+endif
+
 pkgconfig.generate(
   name: 'libpgtypes',
   description: 'PostgreSQL libpgtypes library',
   url: pg_url,
-  libraries: ecpg_pgtypes_so,
-  libraries_private: [frontend_stlib_code],
+  libraries: ecpg_pgtypes_libraries,
+  libraries_private: [frontend_lib_code],
 )
diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build
index a74e885..7354286 100644
--- a/src/interfaces/libpq/meson.build
+++ b/src/interfaces/libpq/meson.build
@@ -60,7 +60,7 @@ libpq_so_c_args = ['-DUSE_DYNAMIC_OAUTH']
 libpq_st = static_library('libpq',
   libpq_sources,
   include_directories: [libpq_inc],
-  c_args: libpq_c_args,
+  c_args: libpq_c_args + ['-DFRONTEND'],
   c_pch: pch_postgres_fe_h,
   dependencies: [frontend_stlib_code, libpq_deps],
   kwargs: default_lib_args,
@@ -80,13 +80,19 @@ libpq_so = shared_library('libpq',
   kwargs: default_lib_args,
 )
 
+if get_option('default_library') == 'shared'
+  libpq_link_with = [libpq_so]
+else
+  libpq_link_with = [libpq_st]
+endif
+
 libpq = declare_dependency(
-  link_with: [libpq_so],
+  link_with: libpq_link_with,
   include_directories: [include_directories('.')]
 )
 
 private_deps = [
-  frontend_stlib_code,
+  frontend_lib_code,
   libpq_deps,
 ]
 
diff --git a/src/port/meson.build b/src/port/meson.build
index fc7b059..3b8cf40 100644
--- a/src/port/meson.build
+++ b/src/port/meson.build
@@ -167,6 +167,19 @@ pgport_variants = {
 
 foreach name, opts : pgport_variants
 
+  if name == '_srv'
+    pgport += {name: disabler()}
+    continue
+  endif
+  if name == '' and get_option('default_library') == 'shared'
+    pgport += {name: disabler()}
+    continue
+  endif
+  if name == '_shlib' and get_option('default_library') == 'static'
+    pgport += {name: disabler()}
+    continue
+  endif
+
   # Build internal static libraries for sets of files that need to be built
   # with different cflags
   cflag_libs = []
@@ -196,6 +209,7 @@ foreach name, opts : pgport_variants
       }
     )
   pgport += {name: lib}
+  pgport_default = lib
 endforeach
 
 pgport_srv = pgport['_srv']
