最近用到了libicnov,但是用到的arm-linux里没有预制libicnov库,更坑的是编译和运行都不保错,只有用到iconv_open()函数时候,返回-1,错误原因是22。
多发查找是该系统里没有libicnov库,或者预制库和交叉编译器版本不一致问题
因此移植最新libicnov库到arm-linux,解决该问题
首先,去官网下载最新libicnov,地址是http://www.gnu.org/software/libiconv/
我使用的是libiconv-1.15,地址是https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
wget https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
下载之后解压,进入目录
tar -xzvf libiconv-1.15.tar.gz
cd libiconv-1.15
然后指定编译方式
./configure -prefix=~/libicnov CC=~/am3352/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-gcc -host=arm-linux -enable-shared -enable-static
上面命令里,-prefix指定安装目录,最好在~,也就是/home/用户名 文件夹下,因为该文件下不需要root权限即可读写。
CC指定交叉编译链,host指定目标主机系统和架构
然后
make
make install
完成后即可在安装目录下的lib下看到preloadable_libiconv.so文件
将 preloadable_libiconv.so 文件复制到arm-linux下任意文件夹,并使用chomd 777 preloadable_libiconv.so 赋予可执行权限
!!!重点!!!
然后,在/etc/profile中将此动态库加入环境变量,
export LD_PRELOAD=/program/preloadable_libiconv.so
其中 /program/preloadable_libiconv.so 就是我放置 preloadable_libiconv.so 的目录。
重启终端或者重启设备,使profile文件生效。
然后就可以愉快的使用libicnov了。
下面是一个使用libicnov的例子,将GBK(GB2312)转换为UTF-8
#include
#include
#include
#include
#include
int code_convert(const char *from_charset, const 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 failed,errno=%s\n", strerror(errno));
return -1;
}
memset(outbuf, 0, outlen);
if (iconv(cd, pin, &inlen, pout, &outlen) == -1)
{
if (0 != cd)
{
iconv_close(cd);
}
printf("iconv failed,errno=%s\n", strerror(errno));
return -1;
}
iconv_close(cd);
return 0;
}
int Gb2312ToUTF8BySysAPI(char *inbuf, size_t inlen, char *outbuf, size_t outlen)
{
return code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, outlen);
}
在需要的地方调用Gb2312ToUTF8BySysAPI函数即可,生成的UTF-8字符串放置在 *outbuf里,注意空间要足够。
inlen为字符串长度,不包括/0,最好用strlen