在Windows下编译iconv

时间:2022-01-19 23:40:57
iconv基于GPL公开源代码,是GNU项目的一部分,在各种Unix-like操作系统下很容易编译和使用,而在Windows下编译iconv就没那么简单了。</span>

官方网站:http://ftp.gnu.org/pub/gnu/libiconv/

最新版的iconv(目前是libiconv-1.14.tar.gz)已经不再提供Visual C++的编译文件,最后一个支持VC编译的iconv版本是libiconv-1.11.1.tar.gz。虽然不是最新版,但是在Windows下编译,只好将就了,功能应该差不了多少。

下载libiconv-1.11.1.tar.gz并解压,打开命令提示行,进入libiconv-1.11.1目录,输入命令:
nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MD
nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MD PREFIX=C:\iconv install
等待编译结束后就能在C:\iconv找到相应的头文件和库文件了。
iconv.exe --version
iconv (GNU libiconv 1.11)
Copyright (C) 2000-2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Bruno Haible.

高版本编译方法,未测试

————————————————————————————————————————

一、首先准备文件:


   1. 下载 Iconv 库,目前最新为 1.31 
          http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz 
    2. 去 www.d2school.com 下载iconvpp


     (这个不是必须的,但其提供了C++的封装,使用起来很方便,感谢nanyu老师)。


 


libiconv-1.13.1.tar.gz 解压到 zipDir 
创建 解决方案目录 ProjectDir


 


zipDir:IConv的打包文件解压目录 
ProcjectDir : 工程编译主目录


二、合并文件 
    1. 复制 iconvpp.cpp 到 ProjectDir 
    2. 复制 ZipDir/Lib/下的所有文件到 ProjectDir/_IConv/ (包括子文件夹) 
    3. 复制 ZipDir/Include/IConv.h.in 到 ProjectDir/_IConv/IConv.h 
    4. 复制 ZipDir/scrLib/localcharset.h 到 ProjectDir/_IConv/ 
    5. 复制 ZipDir/libcharset/lib/localcharset.c 到 ProjectDir/_IConv 
    6. 改名 ProjectDir/_IConv/Config.h.in -> config.h
以下是批处理


@echo 将所有文件复制到这个目录下 :_IConv 
pause 
md _IConv


copy lib/*  _IConv/ 
copy include/IConv.h.in  _IConv/IConv.h 
copy srcLib/localcharset.h  _IConv/ 
copy libcharset/lib/localcharset.c  _IConv/ 
ren  _IConv/Config.h.in Config.h


@echo 目录文件生成成功。 
pause


OK 以上完成了全部文件的准备(在_IConv下)。


 


三、下面用VS2008建工程~: 
1.  建一个Win32 工程,工程名称为IconvLib ,钩选“创建解决方案目录”,选择"静态链接库", 不选“预编译头”,完成。


2. 将 _IConv 目录 复制过来。


3. 将 iconvpp 中的 include 与 src 复制过来。


目录结构如下:


─ProjectDir 
    ├─IconvLIB 
    ├─iconvpp 
    │  ├─include 
    │  │  └─iconvpp 
    │  └─src 
    └─_IConv 




4. 添加现有项,将 iconvpp.cpp , iconv.c ,localcharset.c 添加到工程中.


5. 工程属性->C/C++ –>附加包含目录:../_iconv;../iconvpp/include; 
6. 工程属性->C/C++ ->代码生成->运行时库->多线程调试(/MTd)


这时如果编译会有一堆错误,下面我们来修改一些位置。 


 


四、修改文件内容: 
1. IConv.h : 
   


1).删除掉所有的 @ 符号 (14处) 
2).修改25行: extern DLL_VARIABLE int _libiconv_version;


      为  extern /*DLL_VARIABLE*/ int _libiconv_version;  
3).修改83行:extern size_t iconv (iconv_t cd, ICONV_CONST char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft); 


      为 extern size_t iconv (iconv_t cd, const char* * inbuf, size_t *inbytesleft, char* * outbuf, size_t *outbytesleft);


2. localcharset.c:    


注释掉76行:  # include "configmake.h"


OK 文件修改完成,这时候编译,就可以通过了~。


 


五、测试


新建一个控制台工程。


设置工程属性头文件包含:_iconv和 iconvpp/include 两个目录。


链接 debug/IconvLIB.lib


运行时库->多线程调试(/MTd)


#include "iconvpp/iconvpp.h"


using namespace Iconvpp; 
using namespace std;


int _tmain(int argc, _TCHAR* argv[]) 

    string str; 
    str= Utf8Convert::from_wstring(L"This is a test string~"); 
    printf("%s",str.c_str()); 
    return 0; 
}


最终目录结构如下:


─ProjectDir


├─Debug 
├─ExeTest 
│  └─Debug 
├─IconvLIB 
│  └─Debug 
├─iconvpp 
│  ├─include 
│  │  └─iconvpp 
│  └─src 
└─_IConv 


六、 结束