diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7b6f0ad..18cf15c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -397,6 +397,8 @@ IF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
 ENDIF(DEFINED __GNUWIN32PATH AND EXISTS "${__GNUWIN32PATH}")
 
 SET(ADDITIONAL_LIBS "")
+SET(LIBARCHIVE_LIBS_PRIVATE "") # additional libs for which the pc module is unknown
+SET(LIBARCHIVE_REQUIRES_PRIVATE "") # pc modules for additonal libs
 #
 # Find ZLIB
 #
@@ -410,6 +412,7 @@ IF(ZLIB_FOUND)
   SET(HAVE_ZLIB_H 1)
   INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR})
   LIST(APPEND ADDITIONAL_LIBS ${ZLIB_LIBRARIES})
+  STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " zlib")
   IF(WIN32 AND NOT CYGWIN)
     SET(ZLIB_WINAPI OFF) # skip following test, it crashes with weird message box
     IF(ZLIB_WINAPI)
@@ -442,6 +445,7 @@ IF(BZIP2_FOUND)
   SET(HAVE_BZLIB_H 1)
   INCLUDE_DIRECTORIES(${BZIP2_INCLUDE_DIR})
   LIST(APPEND ADDITIONAL_LIBS ${BZIP2_LIBRARIES})
+  STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " bzip2")
   # Test if a macro is needed for the library.
   TRY_MACRO_FOR_LIBRARY(
     "${BZIP2_INCLUDE_DIR}" "${BZIP2_LIBRARIES}"
@@ -471,6 +475,7 @@ IF(LIBLZMA_FOUND)
   SET(HAVE_LIBLZMA 1)
   SET(HAVE_LZMA_H 1)
   LIST(APPEND ADDITIONAL_LIBS LibLZMA::LibLZMA)
+  STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " liblzma")
 elseif(0)
   CMAKE_PUSH_CHECK_STATE()
   INCLUDE_DIRECTORIES(${LIBLZMA_INCLUDE_DIRS})
@@ -514,6 +519,7 @@ IF(LZO2_FOUND)
   SET(HAVE_LZO_LZO1X_H 1)
   INCLUDE_DIRECTORIES(${LZO2_INCLUDE_DIR})
   LIST(APPEND ADDITIONAL_LIBS ${LZO2_LIBRARY})
+  STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " lzo2")
   #
   # TODO: test for static library.
   #
@@ -526,6 +532,7 @@ IF(LIBB2_FOUND)
   SET(HAVE_BLAKE2_H 1)
   SET(ARCHIVE_BLAKE2 FALSE)
   LIST(APPEND ADDITIONAL_LIBS ${LIBB2_LIBRARY})
+  LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBB2_LIBRARY})
   CMAKE_PUSH_CHECK_STATE()
   SET(CMAKE_REQUIRED_LIBRARIES ${LIBB2_LIBRARY})
   SET(CMAKE_REQUIRED_INCLUDES ${LIBB2_INCLUDE_DIR})
@@ -552,6 +559,7 @@ IF(lz4_FOUND)
   SET(HAVE_LIBLZ4 1)
   SET(HAVE_LZ4_H 1)
   LIST(APPEND ADDITIONAL_LIBS lz4::lz4)
+  STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " liblz4")
   #
   # TODO: test for static library.
   #
@@ -581,6 +589,7 @@ IF(zstd_FOUND)
   LIST(APPEND ADDITIONAL_LIBS zstd::libzstd_static)
   SET(CMAKE_REQUIRED_LIBRARIES zstd::libzstd_static)  
   ENDIF(TARGET zstd::libzstd_shared)
+  STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " libzstd")
 ENDIF(ZSTD_FOUND)
 MARK_AS_ADVANCED(CLEAR ZSTD_INCLUDE_DIR)
 MARK_AS_ADVANCED(CLEAR ZSTD_LIBRARY)
@@ -678,6 +687,7 @@ IF(ENABLE_CNG)
   LA_CHECK_INCLUDE_FILE("Bcrypt.h" HAVE_BCRYPT_H)
   IF(HAVE_BCRYPT_H)
     LIST(APPEND ADDITIONAL_LIBS "Bcrypt")
+    LIST(APPEND LIBARCHIVE_LIBS_PRIVATE "Bcrypt")
   ENDIF(HAVE_BCRYPT_H)
 ELSE(ENABLE_CNG)
   UNSET(HAVE_BCRYPT_H CACHE)
@@ -709,6 +719,7 @@ IF(ENABLE_MBEDTLS)
   IF(MBEDTLS_FOUND)
     SET(HAVE_LIBMBEDCRYPTO 1)
     LIST(APPEND ADDITIONAL_LIBS ${MBEDCRYPTO_LIBRARY})
+    LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${MBEDCRYPTO_LIBRARY})
     INCLUDE_DIRECTORIES(${MBEDTLS_INCLUDE_DIRS})
 
     LIST(APPEND CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIRS})
@@ -729,6 +740,7 @@ IF(ENABLE_NETTLE)
   IF(NETTLE_FOUND)
     SET(HAVE_LIBNETTLE 1)
     LIST(APPEND ADDITIONAL_LIBS ${NETTLE_LIBRARIES})
+    STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " nettle")
     INCLUDE_DIRECTORIES(${NETTLE_INCLUDE_DIR})
 
     LIST(APPEND CMAKE_REQUIRED_INCLUDES ${NETTLE_INCLUDE_DIR})
@@ -753,5 +765,10 @@ IF(ENABLE_OPENSSL AND NOT CMAKE_SYSTEM_NAME MATCHES "Darwin")
   IF(OPENSSL_FOUND)
     SET(HAVE_LIBCRYPTO 1)
     LIST(APPEND ADDITIONAL_LIBS OpenSSL::Crypto)
+    IF(WIN32 AND NOT MINGW)
+      LIST(APPEND LIBARCHIVE_LIBS_PRIVATE "libcrypto")
+    ELSE()
+      STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " libcrypto")
+    ENDIF()
   ENDIF(OPENSSL_FOUND)
 ELSE()
@@ -767,6 +780,7 @@ IF(NOT OPENSSL_FOUND)
     SET(CMAKE_REQUIRED_LIBRARIES "md")
     FIND_LIBRARY(LIBMD_LIBRARY NAMES md)
     LIST(APPEND ADDITIONAL_LIBS ${LIBMD_LIBRARY})
+    LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBMD_LIBRARY})
     CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
   ENDIF(LIBMD_FOUND)
 ENDIF(NOT OPENSSL_FOUND)
@@ -872,7 +886,12 @@ main(int argc, char **argv)
         IF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
           INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
 	  LIST(APPEND ADDITIONAL_LIBS ${OPENSSL_LIBRARIES})
 	   #LIST(REMOVE_DUPLICATES ADDITIONAL_LIBS)
+          IF(WIN32 AND NOT MINGW)
+            LIST(APPEND LIBARCHIVE_LIBS_PRIVATE "libssl")
+          ELSE()
+            STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " libssl")
+          ENDIF()
         ENDIF ("${IMPLEMENTATION}" MATCHES "^OPENSSL$" AND OPENSSL_FOUND)
       ENDIF (ARCHIVE_CRYPTO_${ALGORITHM}_${IMPLEMENTATION})
       ENDIF(NOT ARCHIVE_CRYPTO_${ALGORITHM})
@@ -1045,6 +1060,7 @@ IF(ENABLE_ICONV)
       CHECK_ICONV("libiconv" "")
       IF (HAVE_ICONV)
         LIST(APPEND ADDITIONAL_LIBS ${LIBICONV_PATH})
+        LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBICONV_PATH})
       ENDIF(HAVE_ICONV)
     ENDIF(NOT HAVE_ICONV AND LIBICONV_PATH)
   ENDIF(ICONV_INCLUDE_DIR)
@@ -1078,6 +1094,7 @@ IF(ENABLE_ICONV)
       ENDIF(WIN32 AND NOT CYGWIN)
       IF(HAVE_LOCALE_CHARSET)
         LIST(APPEND ADDITIONAL_LIBS ${LIBCHARSET_PATH})
+        LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBCHARSET_PATH})
       ENDIF(HAVE_LOCALE_CHARSET)
     ENDIF(LIBCHARSET_PATH)
   ENDIF(LIBICONV_PATH)
@@ -1111,6 +1128,7 @@ IF(LIBXML2_FOUND)
   CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
   INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
   LIST(APPEND ADDITIONAL_LIBS ${LIBXML2_LIBRARIES})
+  STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " libxml-2.0")
   SET(HAVE_LIBXML2 1)
   # libxml2's include files use iconv.h
   SET(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR} ${LIBXML2_INCLUDE_DIR})
@@ -1140,6 +1158,7 @@ ELSE(LIBXML2_FOUND)
     CMAKE_PUSH_CHECK_STATE()	# Save the state of the variables
     INCLUDE_DIRECTORIES(${EXPAT_INCLUDE_DIR})
     LIST(APPEND ADDITIONAL_LIBS ${EXPAT_LIBRARIES})
+    STRING(APPEND LIBARCHIVE_REQUIRES_PRIVATE " expat")
     SET(HAVE_LIBEXPAT 1)
     LA_CHECK_INCLUDE_FILE("expat.h" HAVE_EXPAT_H)
     CMAKE_POP_CHECK_STATE()	# Restore the state of the variables
@@ -1170,6 +1189,7 @@ IF(POSIX_REGEX_LIB MATCHES "^(AUTO|LIBC|LIBREGEX)$")
         CHECK_FUNCTION_EXISTS_GLIBC(regcomp HAVE_REGCOMP_LIBREGEX)
         IF(HAVE_REGCOMP_LIBREGEX)
           LIST(APPEND ADDITIONAL_LIBS ${REGEX_LIBRARY})
+          LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${REGEX_LIBRARY})
           #
           # If regex.h is not found, retry looking for regex.h at
           # REGEX_INCLUDE_DIR
@@ -1218,6 +1238,7 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$"
   IF(PCREPOSIX_FOUND)
     INCLUDE_DIRECTORIES(${PCRE_INCLUDE_DIR})
     LIST(APPEND ADDITIONAL_LIBS ${PCREPOSIX_LIBRARIES})
+    LIST(APPEND LIBARCHIVE_LIBS_PRIVATE  ${PCREPOSIX_LIBRARIES})
     # Test if a macro is needed for the library.
     TRY_MACRO_FOR_LIBRARY(
       "${PCRE_INCLUDE_DIR}" "${PCREPOSIX_LIBRARIES}"
@@ -1229,6 +1250,7 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$"
 	ELSEIF(NOT WITHOUT_PCRE_STATIC AND NOT PCRE_STATIC AND PCRE_FOUND)
 	  # Determine if pcre static libraries are to be used.
       LIST(APPEND ADDITIONAL_LIBS ${PCRE_LIBRARIES})
+      LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${PCRE_LIBRARIES})
       SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES})
       MESSAGE(STATUS "trying again with -lpcre included")
       TRY_MACRO_FOR_LIBRARY(
@@ -1244,6 +1266,7 @@ IF(NOT FOUND_POSIX_REGEX_LIB AND POSIX_REGEX_LIB MATCHES "^(AUTO|LIBPCREPOSIX)$"
         # ___chkstk_ms.
         MESSAGE(STATUS "Visual Studio build detected, trying again with -lgcc included")
         LIST(APPEND ADDITIONAL_LIBS ${LIBGCC_LIBRARIES})
+        LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${LIBGCC_LIBRARIES})
         SET(TMP_LIBRARIES ${PCREPOSIX_LIBRARIES} ${PCRE_LIBRARIES} ${LIBGCC_LIBRARIES})
           TRY_MACRO_FOR_LIBRARY(
             "${PCRE_INCLUDE_DIR}" "${TMP_LIBRARIES}"
@@ -1762,6 +1785,7 @@ IF(ENABLE_ACL)
     SET(CMAKE_REQUIRED_LIBRARIES "acl")
     FIND_LIBRARY(ACL_LIBRARY NAMES acl)
     LIST(APPEND ADDITIONAL_LIBS ${ACL_LIBRARY})
+    LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${ACL_LIBRARY})
   ENDIF(HAVE_LIBACL)
 
   CHECK_TYPE_EXISTS(acl_t "sys/types.h;sys/acl.h" HAVE_ACL_T)
@@ -1901,6 +1925,7 @@ int main(void) { return ACL_SYNCHRONIZE; }" HAVE_DECL_ACL_SYNCHRONIZE)
     SET(CMAKE_REQUIRED_LIBRARIES "richacl")
     FIND_LIBRARY(RICHACL_LIBRARY NAMES richacl)
     LIST(APPEND ADDITIONAL_LIBS ${RICHACL_LIBRARY})
+    LIST(APPEND LIBARCHIVE_LIBS_PRIVATE ${RICHACL_LIBRARY})
   ENDIF(HAVE_LIBRICHACL)
 
   CHECK_STRUCT_HAS_MEMBER("struct richace" e_type "sys/richacl.h"
diff --git a/build/cmake/CreatePkgConfigFile.cmake b/build/cmake/CreatePkgConfigFile.cmake
index bc5a43f..422b83b 100644
--- a/build/cmake/CreatePkgConfigFile.cmake
+++ b/build/cmake/CreatePkgConfigFile.cmake
@@ -8,7 +8,7 @@ SET(libdir \${exec_prefix}/lib)
 SET(includedir \${prefix}/include)
 # Now, this is not particularly pretty, nor is it terribly accurate...
 # Loop over all our additional libs
-FOREACH(mylib ${ADDITIONAL_LIBS})
+FOREACH(mylib ${LIBARCHIVE_LIBS_PRIVATE})
 	# Extract the filename from the absolute path
 	GET_FILENAME_COMPONENT(mylib_name ${mylib} NAME_WE)
 	# Strip the lib prefix
@@ -16,10 +16,6 @@ FOREACH(mylib ${ADDITIONAL_LIBS})
 	# Append it to our LIBS string
 	SET(LIBS "${LIBS} -l${mylib_name}")
 ENDFOREACH()
-# libxml2 is easier, since it's already using pkg-config
-FOREACH(mylib ${PC_LIBXML_STATIC_LDFLAGS})
-	SET(LIBS "${LIBS} ${mylib}")
-ENDFOREACH()
 # FIXME: The order of the libraries doesn't take dependencies into account,
 #	 thus there's a good chance it'll make some binutils versions unhappy...
 #	 This only affects Libs.private (looked up for static builds) though.
diff --git a/build/pkgconfig/libarchive.pc.in b/build/pkgconfig/libarchive.pc.in
index 4b631e6..80198f1 100644
--- a/build/pkgconfig/libarchive.pc.in
+++ b/build/pkgconfig/libarchive.pc.in
@@ -10,3 +10,4 @@ Cflags: -I${includedir}
 Cflags.private: -DLIBARCHIVE_STATIC
 Libs: -L${libdir} -larchive
 Libs.private: @LIBS@
+Requires.private: @LIBARCHIVE_REQUIRES_PRIVATE@