GNU libiconv - 字符集转换库,支持在不同字符编码之间进行转换。
这是针对原生构建优化的版本,提供了 CMake 和 Visual Studio 项目文件,无需 Cygwin/MSYS2 环境即可在 Windows 上构建。
- 支持 200+ 种字符编码
- 兼容 POSIX iconv API
- 跨平台支持:Windows、Linux、macOS
cmake -B build -A x64
cmake --build build --config Release预配置的 Visual Studio 解决方案位于 msvc/ 目录:
| 目录 | Visual Studio | 工具集 |
|---|---|---|
msvc/16 |
VS2019 | v142 |
msvc/17 |
VS2022 | v143 |
msvc/18 |
VS2026 | v145 |
直接用对应版本的 Visual Studio 打开 libiconv.sln 即可构建。
输出文件:
charset.lib- 静态库iconv.dll/iconv.lib- 动态库及导入库
注意:glibc (Linux) 和 macOS 系统库已内置 iconv。为避免冲突,建议安装到独立目录。
# Ubuntu/Debian
sudo apt-get install -y build-essential gettext
# CentOS/RHEL/Fedora
sudo yum install -y gcc make gettext
# macOS (使用 Homebrew)
brew install gettext# 配置(默认安装到 /usr/local)
bash ./configure
# 或指定安装路径
bash ./configure --prefix=/opt/libiconv
# 编译
make
# 安装
sudo make installcmake -B build -DCMAKE_INSTALL_PREFIX=/opt/libiconv
cmake --build build
sudo cmake --install build使用时指定路径:
# 编译时
gcc -I/opt/libiconv/include -L/opt/libiconv/lib -liconv your_code.c
# 运行时
export LD_LIBRARY_PATH=/opt/libiconv/lib:$LD_LIBRARY_PATH # Linux
export DYLD_LIBRARY_PATH=/opt/libiconv/lib:$DYLD_LIBRARY_PATH # macOS| 选项 | 默认值 | 说明 |
|---|---|---|
BUILD_SHARED_LIBS |
ON |
构建动态库 |
ICONV_ENABLE_EXTRA |
OFF |
启用额外的编码支持 |
ICONV_EMBED_MODE |
OFF |
嵌入模式(重命名符号避免冲突) |
ICONV_EMBED_PREFIX |
embed_ |
嵌入模式的符号前缀 |
示例:
cmake -B build -DICONV_ENABLE_EXTRA=ON当你需要将 libiconv 静态链接到自己的项目中,且目标系统可能已有系统级 libiconv(如 macOS),可以启用嵌入模式来避免符号冲突:
cmake -B build -DBUILD_SHARED_LIBS=OFF -DICONV_EMBED_MODE=ON嵌入模式会:
- 设置符号可见性为 hidden(仅对 GCC/Clang 有效)
- 将所有导出符号重命名,添加前缀(默认
embed_)
例如:
libiconv_open→embed_libiconv_openlibiconv→embed_libiconvlibiconv_close→embed_libiconv_close
自定义前缀:
cmake -B build -DBUILD_SHARED_LIBS=OFF -DICONV_EMBED_MODE=ON -DICONV_EMBED_PREFIX="myapp_"find_package(iconv REQUIRED)
target_link_libraries(your_target PRIVATE Iconv::Iconv)pkg-config --cflags --libs iconv#include <iconv.h>
iconv_t cd = iconv_open("UTF-8", "GBK");
if (cd != (iconv_t)-1) {
char *inbuf = "你好";
size_t inbytesleft = strlen(inbuf);
char outbuf[256];
char *outptr = outbuf;
size_t outbytesleft = sizeof(outbuf);
iconv(cd, &inbuf, &inbytesleft, &outptr, &outbytesleft);
iconv_close(cd);
}libiconv-1.18/
├── CMakeLists.txt # CMake 构建配置
├── lib/ # libiconv 核心源码
├── libcharset/ # 字符集检测库
├── src/ # iconv 命令行工具
├── msvc/ # Visual Studio 项目
│ ├── 16/ # VS2019
│ ├── 17/ # VS2022
│ └── 18/ # VS2026
└── cmake/ # CMake 包配置文件
GNU LGPL v2.1 - 详见 COPYING.LIB