iconv 静态库的编译

时间:2022-01-04 22:51:47

关键字:VS2008  编译 iconv  windows

小巧的开源编码转换库,不用多说了吧~:)

一、首先准备文件:

   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

六、 结束