Everlasting Pages

返回

Windows 下给 MinGW 手动补齐 iconv.h 环境教程#

1. 问题背景#

在 Windows 下使用 MinGW / WinLibs 编译 C++ 代码时,如果包含:

#include <bits/extc++.h>
cpp

可能会遇到类似错误:

fatal error: iconv.h: No such file or directory
text

错误链大概是:

<bits/extc++.h>

<ext/codecvt_specializations.h>

<iconv.h>

找不到 iconv.h
text

这个问题的本质不是 C++ 代码写错了,而是当前 MinGW 环境里缺少 libiconv 相关的头文件和库文件。


2. 适用环境#

本教程适用于 Windows 下手动配置 MinGW / WinLibs 环境,并且不想安装完整 MSYS2,只想补齐 iconv.h 相关文件的情况。

可以通过下面命令查看自己的编译器信息:

g++ -v
cmd

重点观察输出中的关键词,比如:

x86_64-w64-mingw32
ucrt
mingw64
clang64
i686
text

根据自己的环境选择对应的 libiconv 包:

你的环境关键词应下载的包
普通 64 位 MinGW / MSVCRTx86_64-w64-mingw32mingw64、没有 ucrtmingw-w64-x86_64-libiconv
UCRT64ucrtucrt64mingw-w64-ucrt-x86_64-libiconv
CLANG64clang64clang-x86_64mingw-w64-clang-x86_64-libiconv
32 位 MinGWi686mingw32mingw-w64-i686-libiconv

例如,如果 g++ -v 输出中有类似:

MinGW-W64 x86_64-ucrt-posix-seh
text

说明你使用的是 UCRT64 版本,这种情况下应该下载:

mingw-w64-ucrt-x86_64-libiconv
text

如果输出中没有 ucrt,而是普通的 64 位 MinGW 环境,一般应该下载:

mingw-w64-x86_64-libiconv
text

3. 下载 libiconv 包#

进入 MSYS2 Packages 页面,下载自己环境对应的 libiconv 包。

MSYS2 Packages 搜索页:

https://packages.msys2.org/search?t=binpkg&q=libiconv
text

也可以根据自己的环境直接进入对应页面:

你的环境应下载的包下载页面
普通 64 位 MinGW / MSVCRTmingw-w64-x86_64-libiconvhttps://packages.msys2.org/package/mingw-w64-x86_64-libiconv
UCRT64mingw-w64-ucrt-x86_64-libiconvhttps://packages.msys2.org/package/mingw-w64-ucrt-x86_64-libiconv
CLANG64mingw-w64-clang-x86_64-libiconvhttps://packages.msys2.org/package/mingw-w64-clang-x86_64-libiconv
32 位 MinGWmingw-w64-i686-libiconvhttps://packages.msys2.org/package/mingw-w64-i686-libiconv

进入对应页面后,找到页面中的 File 一栏,下载 .pkg.tar.zst 文件。

例如 UCRT64 环境的页面中,文件名通常类似:

mingw-w64-ucrt-x86_64-libiconv-1.19-1-any.pkg.tar.zst
text

普通 64 位 MinGW 环境的文件名通常类似:

mingw-w64-x86_64-libiconv-1.19-1-any.pkg.tar.zst
text

注意:版本号可能会随着 MSYS2 更新而变化,所以实际下载时以页面中的 File 一栏为准。


4. 解压 .pkg.tar.zst 文件#

下载后你会得到一个类似这样的文件:

mingw-w64-ucrt-x86_64-libiconv-1.19-1-any.pkg.tar.zst
text

解压展开后一般会看到一个环境目录,例如:

ucrt64
text

或者:

mingw64
text

再展开后应该有:

环境目录\bin
环境目录\include
环境目录\lib
text

例如 UCRT64 包中通常是:

ucrt64\bin
ucrt64\include
ucrt64\lib
text

普通 MINGW64 包中通常是:

mingw64\bin
mingw64\include
mingw64\lib
text

5. 复制文件到你的 MinGW 目录#

假设你的 MinGW / WinLibs GCC 安装目录是:

D:\gcc-14.2.0\mingw64
text

那么要把解压出来的环境目录中的文件复制到这个目录下。

例如你解压出来的是:

ucrt64
text

就把 ucrt64 里面的 includelibbin 中的相关文件复制到:

D:\gcc-14.2.0\mingw64\include
D:\gcc-14.2.0\mingw64\lib
D:\gcc-14.2.0\mingw64\bin
text

如果你解压出来的是:

mingw64
text

也是同理,把里面对应的文件复制到你自己的 MinGW 安装目录。


5.1 复制 include 文件#

从解压目录:

环境目录\include
text

复制以下文件:

iconv.h
libcharset.h
localcharset.h
text

到你的 MinGW include 目录:

D:\gcc-14.2.0\mingw64\include
text

也就是最终应该存在:

D:\gcc-14.2.0\mingw64\include\iconv.h
D:\gcc-14.2.0\mingw64\include\libcharset.h
D:\gcc-14.2.0\mingw64\include\localcharset.h
text

5.2 复制 lib 文件#

从解压目录:

环境目录\lib
text

复制以下文件:

libiconv.a
libiconv.dll.a
libcharset.a
libcharset.dll.a
text

到你的 MinGW lib 目录:

D:\gcc-14.2.0\mingw64\lib
text

最终应该存在:

D:\gcc-14.2.0\mingw64\lib\libiconv.a
D:\gcc-14.2.0\mingw64\lib\libiconv.dll.a
D:\gcc-14.2.0\mingw64\lib\libcharset.a
D:\gcc-14.2.0\mingw64\lib\libcharset.dll.a
text

5.3 复制 bin 文件#

从解压目录:

环境目录\bin
text

复制以下文件:

libiconv-2.dll
libcharset-1.dll
text

到你的 MinGW bin 目录:

D:\gcc-14.2.0\mingw64\bin
text

最终应该存在:

D:\gcc-14.2.0\mingw64\bin\libiconv-2.dll
D:\gcc-14.2.0\mingw64\bin\libcharset-1.dll
text

复制完后即可正常编译运行了

关于<bits/extc++.h>在windows上编译失败的解决方案
https://blog.everlasting.xin/blog/fixed_extch_problem/
Author Everlasting
Published at 2026年5月20日
Comment seems to stuck. Try to refresh?✨