編譯 iconv 庫
libiconv是将一種編碼格式轉換為另一種編碼格式的跨平台開源庫,http://www.gnu.org/software/libiconv/可以檢視支援轉換的編碼類型。但是libiconv 的開發者并沒有釋出windows下的源碼和庫,要想在windows下使用libiconv 庫,必須自己手動把libiconv 移植到windows平台,具體步驟如下:
可以直接下載下傳我建立的工程: iconv 工程下載下傳
1、去http://ftp.gnu.org/pub/gnu/libiconv/下載下傳源碼包,本文使用的是libiconv-1.16.tar.gz
2、建立libiconv 動态庫工程
3、拷貝檔案
(1)将 “ libiconv-1.16\lib“ 目錄下的 “relocatable.h”, “relocatable.c” and “iconv.c” 三個檔案拷貝到工程目錄下
(2)将 “libiconv-1.16\libcharset\lib\localcharset.c” 檔案拷貝到工程目錄下
(3) 将 “libiconv-1.16\libcharset\include\localcharset.h.build.in" 檔案拷貝到工程目錄下,并修改檔案名稱為 localcharset.h
(4)将 “\libiconv-1.16\windows\libiconv.rc” 拷貝到工程目錄下
(5) 在工程目錄下建立 include 目錄,
(6) 将 “\libiconv-1.16\include\iconv.h.build.in ” 拷貝到 include 目錄下,并重命名為 iconv.h
(7) 将 “\libiconv-1.16\config.h.in” 拷貝到 include 目錄下,并重命名為 config.h
(8)将 “\libiconv-1.16\lib” 目錄下所有的 .h 和 .def 檔案拷貝到 include目錄下
![在這裡插入圖檔描述](https://img-blog.csdnimg.cn/20200514150446382.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pob3VndWFuZ2NhaTg=,size_16,color_FFFFFF,t_70#pic_center)
4、工程中添加現有項,将 iconv.c ,localcharset.c、localcharset.h、relocatable.c、relocatable.h、libiconv.rc 添加到工程中.
5、修改工程配置。如下圖
1)配置頭檔案包含目錄
在建構動态連結庫libiconv.dll時,最好将運作時庫設定為“多線程”。因為libiconv.dll不需要VC運作庫,隻有使用libiconv.dll的應用程式可能需要也可能不需要VC運作庫,是以對VC運作庫的依賴可以由将要建構并動态連結到libiconv.dll的應用程式來控制
由于工程中含有 .c 檔案,是以這裡我設定不使用預編譯頭
6、修改檔案中的BUG
(1) localcharset.h : 第21-27行
代碼
#if @[email protected] && BUILDING_LIBCHARSET
#define LIBCHARSET_DLL_EXPORTED __attribute__((__visibility__("default")))
#elif defined _MSC_VER && BUILDING_LIBCHARSET
#define LIBCHARSET_DLL_EXPORTED __declspec(dllexport)
#else
#define LIBCHARSET_DLL_EXPORTED
#endif
修改為:
#ifdef LIBICONV_EXPORTS
#define LIBCHARSET_DLL_EXPORTED __declspec(dllexport)
#elif USING_STATIC_LIBICONV
#define LIBCHARSET_DLL_EXPORTED
#else
#define LIBCHARSET_DLL_EXPORTED __declspec(dllimport)
#endif
(2) iconv.h 第 25 - 32 行
源代碼:
#if @[email protected] && BUILDING_LIBICONV
#define LIBICONV_DLL_EXPORTED __attribute__((__visibility__("default")))
#elif defined _MSC_VER && BUILDING_LIBICONV
#define LIBICONV_DLL_EXPORTED __declspec(dllexport)
#else
#define LIBICONV_DLL_EXPORTED
#endif
extern LIBICONV_DLL_EXPORTED @[email protected] int _libiconv_version; /* Likewise */
修改為:
#ifdef LIBICONV_EXPORTS
#define LIBICONV_DLL_EXPORTED __declspec(dllexport)
#elif USING_STATIC_LIBICONV
#define LIBICONV_DLL_EXPORTED
#else
#define LIBICONV_DLL_EXPORTED __declspec(dllimport)
#endif
extern LIBICONV_DLL_EXPORTED int _libiconv_version; /* Likewise */
第 91 行:
源代碼:
修改為:
第 109、110 行:
源代碼:
#if @[email protected]
#if @[email protected]
修改為:
#if USE_MBSTATE_T
#if BROKEN_WCHAR_H
第 130 行:
源代碼:
修改為:
第170行:
源代碼:
修改為:
(3) iconv.c 第 250 行
源代碼:
size_t iconv (iconv_t icd,
ICONV_CONST char* * inbuf, size_t *inbytesleft,
char* * outbuf, size_t *outbytesleft)
修改為:
size_t iconv (iconv_t icd,
const char* * inbuf, size_t *inbytesleft,
char* * outbuf, size_t *outbytesleft)
(4)config.h 第 30 行
删除代碼:
(5)libconv.rc:
在第4行增加代碼:
#define PACKAGE_VERSION_MAJOR 1
#define PACKAGE_VERSION_MINOR 14
#define PACKAGE_VERSION_SUBMINOR 0
#define PACKAGE_VERSION_STRING "1.14"
7、編譯時需要将所有得 C 檔案單獨編譯一下,然後再編譯整個工程
編譯libxml2-2.9.10(32位)
1、 iconv庫準備
在d盤建立目錄:,opt下面建立目錄include、lib\debug、lib\release,把iconv的庫分别拷貝到(名稱修改為 iconv.lib、iconv.dll)lib\debug 和 lib\release 目錄下,把頭檔案放到include下
2、下載下傳 libxml2-2.9.10 源碼,下載下傳位址:
https://gitlab.gnome.org/GNOME/libxml2/#
下載下傳完成之後,解壓至相應的工作目錄
3、 打開Visual Studio 2010 指令提示(“Visual Studio Command Prompt 2010”),進到相應目錄下
cd E:\Work\libxml2-2.9.10\win32
3、 環境配置
Debug 和 Release 的配置二選一
Debug 版本
cscript configure.js compiler=msvc prefix=d:\opt\debug include=d:\opt\include lib=d:\opt\lib\debug debug=yes
Release 版本
cscript configure.js compiler=msvc prefix=d:\opt\release include=d:\opt\include lib=d:\opt\lib\realse debug=no
4、編譯(生成庫檔案)
nmake /f Makefile.msvc
5、安裝(拷貝庫檔案到opt目錄下)
nmake /f Makefile.msvc install
編譯libxml2-2.9.3(64位)
1、 iconv庫(64位)準備
在d盤建立目錄:opt64,opt64下面建立目錄include、lib,把iconv的庫放到lib下,把頭檔案放到include下
2、 打開Visual Studio x64 Win64 Command Prompt 2010指令提示,進到相應目錄下
cd E:\Work\libxml2-2.9.10\win32
後續操作和 32 位版本相同
三、編譯 libxslt (32位)
1、 libxml2、iconv庫準備
把 libxml2\debug\lib 目錄下所有檔案拷貝至 libxml2\lib\debug 目錄下
把 libxml2\release\lib 目錄下所有檔案拷貝至 libxml2\lib\release 目錄下
把 libxml2\debug\include\libxml2 目錄下的 libxml 目錄拷貝到 libxml2\include 目錄下
2、下載下傳 libxlst 源碼,下載下傳位址:
hhttps://gitlab.gnome.org/GNOME/libxslt
下載下傳完成之後,解壓至相應的工作目錄
23、 打開Visual Studio 2010 指令提示(“Visual Studio Command Prompt 2010”),進到相應目錄下
cd E:\Work\libxslt-master\win32
3、 環境配置
Debug 和 Release 的配置二選一
Debug 版本
cscript configure.js compiler=msvc prefix=d:\opt\debug include=d:\opt\include lib=d:\opt\lib\debug debug=yes
Release 版本
cscript configure.js compiler=msvc prefix=d:\opt\release include=d:\opt\include lib=d:\opt\lib\realse debug=no
4、編譯(生成庫檔案)
nmake /f Makefile.msvc
5、安裝(拷貝庫檔案到opt目錄下)
nmake /f Makefile.msvc install
四、編譯libxslt-1.1.29(64位)
同 libxml2 的步驟相同
五、如何給編譯的libxml2、libxslt庫自己指定命名?
1、 libxml2
①libxml2-2.9.3\win32目錄下,使用Notepad打開檔案Makefile.msvc,修改XML_NAME的值,預設值為xml2
如:XML_NAME = xml2-2.9.3
②libxml2-2.9.3\win32目錄下,将檔案libxml2.def.src重命名為libxml2-2.9.3.def.src
③重新編譯、安裝即可
2、 libxslt
①libxslt-1.1.29\win32目錄下,使用Notepad打開檔案Makefile.msvc,修改XSLT_NAME和EXSLT_NAME的值,XSLT_NAME預設值為xslt,EXSLT_NAME預設值為exslt
如:XSLT_NAME = xslt-1.1.29
EXSLT_NAME = exslt-1.1.29
②如果要修改libxslt依賴的libxml2庫的名字,則在Makefile.msvc全文搜尋libxml2*.lib,修改為指定相應libxml2庫的名字即可。
③libxslt-1.1.29\win32目錄下,
将檔案libxslt.def.src重命名為libxslt-1.1.29.def.src
将檔案libexslt.def.src重命名為libexslt-1.1.29.def.src
④重新編譯、安裝即可