diff --git a/CMakeLists.txt b/CMakeLists.txt
index bee6cd581..019d8c2c6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -100,6 +100,8 @@ set(EXTRA_DIST
   tools
 )

+find_package(Iconv)
+
 include(GNUInstallDirs)
 include(XercesWarnings)
 include(XercesIncludes)
diff --git a/cmake/XercesMsgLoaderSelection.cmake b/cmake/XercesMsgLoaderSelection.cmake
index f0d9b0d0d..10efd77d8 100644
--- a/cmake/XercesMsgLoaderSelection.cmake
+++ b/cmake/XercesMsgLoaderSelection.cmake
@@ -32,7 +32,8 @@ check_include_file_cxx(nl_types.h HAVE_NLTYPES_H)
 check_function_exists(catopen HAVE_CATOPEN)
 check_function_exists(catclose HAVE_CATCLOSE)
 check_function_exists(catgets HAVE_CATGETS)
-if(HAVE_NLTYPES_H AND HAVE_CATOPEN AND HAVE_CATCLOSE AND HAVE_CATGETS)
+if(HAVE_NLTYPES_H AND HAVE_CATOPEN AND HAVE_CATCLOSE AND HAVE_CATGETS AND
+   Iconv_FOUND)
   set(iconv_available 1)
 endif()
 if(iconv_available)
diff --git a/cmake/XercesTranscoderSelection.cmake b/cmake/XercesTranscoderSelection.cmake
index 5dd7c6257..16a32ff60 100644
--- a/cmake/XercesTranscoderSelection.cmake
+++ b/cmake/XercesTranscoderSelection.cmake
@@ -41,7 +41,6 @@ endif()

 # GNU iconv

-check_include_file_cxx(iconv.h HAVE_ICONV_H)
 check_include_file_cxx(wchar.h HAVE_WCHAR_H)
 check_include_file_cxx(ctype.h HAVE_CTYPE_H)
 check_include_file_cxx(locale.h HAVE_LOCALE_H)
@@ -49,15 +48,11 @@ check_include_file_cxx(errno.h HAVE_ERRNO_H)
 check_include_file_cxx(endian.h HAVE_ENDIAN_H)
 check_include_file_cxx(machine/endian.h HAVE_MACHINE_ENDIAN_H)
 check_include_file_cxx(arpa/nameser_compat.h HAVE_ARPA_NAMESER_COMPAT_H)
-check_function_exists(iconv_open HAVE_ICONV_OPEN)
-check_function_exists(iconv_close HAVE_ICONV_CLOSE)
-check_function_exists(iconv HAVE_ICONV)

 set(gnuiconv_available 0)
-if(HAVE_ICONV_H AND HAVE_WCHAR_H AND
-   HAVE_CTYPE_H AND HAVE_LOCALE_H AND HAVE_ERRNO_H)
+if(HAVE_WCHAR_H AND HAVE_CTYPE_H AND HAVE_LOCALE_H AND HAVE_ERRNO_H)
   if (HAVE_ENDIAN_H OR HAVE_MACHINE_ENDIAN_H OR HAVE_ARPA_NAMESER_COMPAT_H)
-    if(HAVE_ICONV_OPEN AND HAVE_ICONV_CLOSE AND HAVE_ICONV)
+    if(Iconv_IS_BUILT_IN)
       set(gnuiconv_available 1)
       list(APPEND transcoders gnuiconv)
     endif()
@@ -79,7 +74,8 @@ check_function_exists(wcstombs HAVE_WCSTOMBS)
 check_function_exists(mbstowcs HAVE_MBSTOWCS)

 set(iconv_available 0)
-if(HAVE_WCHAR_H AND HAVE_MBLEN AND HAVE_WCSTOMBS AND HAVE_MBSTOWCS)
+if(HAVE_WCHAR_H AND HAVE_MBLEN AND HAVE_WCSTOMBS AND HAVE_MBSTOWCS AND
+   Iconv_FOUND)
   set(iconv_available 1)
   list(APPEND transcoders iconv)
 endif()
diff --git a/config.h.cmake.in b/config.h.cmake.in
index b86c12f1f..cf5e09ff4 100644
--- a/config.h.cmake.in
+++ b/config.h.cmake.in
@@ -67,18 +67,6 @@
 /* Define to 1 if you have the `gmtime_r' function. */
 #cmakedefine HAVE_GMTIME_R 1

-/* Define to 1 if you have the `iconv' function. */
-#cmakedefine HAVE_ICONV 1
-
-/* Define to 1 if you have the `iconv_close' function. */
-#cmakedefine HAVE_ICONV_CLOSE 1
-
-/* Define to 1 if you have the <iconv.h> header file. */
-#cmakedefine HAVE_ICONV_H 1
-
-/* Define to 1 if you have the `iconv_open' function. */
-#cmakedefine HAVE_ICONV_OPEN 1
-
 /* Define to 1 if you have the <langinfo.h> header file. */
 #cmakedefine HAVE_LANGINFO_H 1

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index aef3a76f9..35410409d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1116,11 +1116,13 @@ endif()
 if(XERCES_USE_TRANSCODER_GNUICONV)
   list(APPEND libxerces_c_SOURCES ${gnuiconv_sources})
   list(APPEND libxerces_c_HEADERS ${gnuiconv_headers})
+  list(APPEND libxerces_c_DEPS Iconv::Iconv) # convinient for CMake to analyse dependencies
 endif()

 if(XERCES_USE_TRANSCODER_ICONV)
   list(APPEND libxerces_c_SOURCES ${iconv_sources})
   list(APPEND libxerces_c_HEADERS ${iconv_headers})
+  list(APPEND libxerces_c_DEPS Iconv::Iconv)
 endif()

 if(XERCES_USE_TRANSCODER_MACOSUNICODECONVERTER)
