libiconv-1.14.tar.gz在arm上的移植
通過交叉編譯工具鏈生成arm平臺上的iconv連結庫和標頭檔案
作業系統:centos6.5
libiconv-1.14.tar.gz下載地址:http://download.csdn.net/detail/shanleichicheng/4538600
交叉編譯工具鏈:http://blog.csdn.net/qq_22790049/article/details/52452445
1、解壓原始碼
tar -xzvf libiconv-1.14.tar.gz
2、建立存放編譯生成的資料夾
mkdir /usr/local/icon-arm-linux
3、進入原始碼進行配置
#cd libiconv-1.14
#./configure --host=arm-linux --prefix=/usr/local/iconv-arm-linux
4、編譯
#make
....
#make install
....
5、編譯生成
在配置的時候我們指定了交叉工具鏈和生成路徑
在編譯生成路徑的目錄下,bin目錄為生成的命令,include為生成的標頭檔案,lib為生成的動態連結庫。此時我們就可以運用標頭檔案和動態連結庫進行程式設計了,注意在編譯的時候一定要連結這個動態庫,在執行時將動態庫放入/lib目錄下。
6、在makefiel檔案中使用-liconv呼叫libiconv動態庫檔案時,若出現“error while loading sharedlibraries: libiconv.so.2”錯誤,解決方法為:
$updatedb
$locate libiconv.so.2
發現該庫已經安裝,位置在/usr/local/lib/libiconv.so.2。既然已經安裝,為什麼提示找不到?繼續下一步排查。
$ldconfig
7、標頭檔案
#ifndef CODE_CONVERT___H
#define CODE_CONVERT___H
#include "iconv.h"
/*iconv.h該檔案在編譯庫中,編譯程式時加動態庫*/
#include <string>
//#include <iostream>
//using namespace std;
class code_convert
{
public:
int code_converts(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf, size_t outlen);
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen);
int u2g(char *inbuf,size_t inlen,char *outbuf,size_t outlen);
protected:
private:
};
#endif // CODE_CONVERT_H
8、c檔案
#include "code_convert.h"
#include <stdio.h>
#include <string.h>
int code_convert::code_converts(char *from_charset,char *to_charset,char *inbuf,size_t inlen,char *outbuf, size_t outlen)
{
iconv_t cd;
char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0){
printf("iconv_open error!\n");
return -1;
}
memset(outbuf,0,outlen);
if(iconv(cd,pin,&inlen,pout,&outlen) == -1){
memcpy(outbuf,inbuf,inlen);
printf("iconv error!\n");
return -1;
}
iconv_close(cd);
return 0;
}
//UNICODE
int code_convert::u2g(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_converts((char *)"utf-8",(char *)"gb2312",(char *)inbuf,inlen,(char *)outbuf,outlen);
}
//GB2312
int code_convert::g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_converts((char *)"gb2312",(char *)"utf-8",(char *)inbuf,inlen,(char *)outbuf,outlen);
}