libicnov库移植到ARM-linux

最近用到了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

你可能感兴趣的:(嵌入式linux软件移植)