通过交叉编译工具链生成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。既然已经安装,为什么提示找不到?继续下一步排查。
strace./indexer将打印出所有indexer启动时调用的文件及程序名称,在输出的信息中,发现查找库libiconv.so.2的路径是/lib目录和/usr/lib这两个目录。好了,问题找到了,将/usr/local/lib下面该库链接到/usr/lib下面即可ln -s /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2
$ldconfig
7、头文件
#ifndef CODE_CONVERT___H
#define CODE_CONVERT___H
#include "iconv.h"
/*iconv.h该文件在编译库中,编译程序时加动态库*/
#include
//#include
//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
#include
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);
}