ubuntu下交叉编译iconv库到arm 32位使用,实现GB2312与UTF-8的转换

一、编译和测试环境

Host:Ubuntu 16.04.7 LTS 64位
开发板: I.MX6ULL armv7架构 32位

二、 问题描述与解决方案

在6ull开发板上默认使用iconv_open(“utf-8”,“gb2312”)函数时,会返回错误,使用perror函数获取对应错误编号errno代表的错误字符串信息“invalid argument”。经过查询资料得知iconv相关函数为libc中的函数,初步分析得出结论为有可能是libc版本中iconv相关函数的版本不同造成的,因此要更新iconv相关函数。
更新iconv相关函数有两种方法:
第一,更新libc库;
第二,更新libiconv库。
第一种方法更新libc库比较麻烦,因为我们用的是编译好的交叉编译器,这中方法需要重新编译生成交叉编译器,并且也需要使用新编译生成的交叉编译工具重新编译应用程序,因此本方法代价太大,采用第二种方法。
第二种方法为只更新libiconv库,到iconv官网下载最新的库源码包,下载地址为:http://ftp.gnu.org/gnu/libiconv
我下载的是libiconv-1.16版本。
查了挺多资料发现有些人的解决方案是下载的1.14版本,然后编译会生成preloadable_libiconv.so库文件,设置开发板环境变量

$ export LD_PRELOAD=/lib/preloadable_libiconv.so

我这边是放在/etc/profile 文件里面,一开始参照网上配置文件,生成的64位,运行时直接报错wrong ELF class啥的,看下图:
在这里插入图片描述
后来查资料解决了该问题,但是iconv_open函数还是报同样的错误,可能是编译生成的32位版本还是不对,希望后面有时间更熟悉这块能回头找到原因吧,暂时没找到原因就下载了另外一个版本。
下载文件后解压压缩包,然后在配置和编译生成需要的库文件:

tar -vxzf libiconv-1.16.tar.gz
./configure --prefix=$PWD/output_lib CC=arm-linux-gnueabihf-gcc --host=arm-linux --enable-shared -enable-static
# --prefix 指定存放生成文件的路径 output_lib --host:指定编译平台
make
makeinstall

保存生成文件的文件夹output_lib下有4个文件夹,lib下面有动态库和静态库文件,include下面是头文件,share下面含有inonc的man手册的相关文档。
在这里插入图片描述
在这里插入图片描述

如果使用动态库,要将动态库文件放到交叉编译器的库下面,同时修改makefile包含库文件 :
-L ( p r o p a t h ) / i c o n v / l i b − l i c o n v − l c h a r s e t ,包含头文件 − I (pro_path)/iconv/lib -liconv -lcharset,包含头文件 -I (

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值