一、编译和测试环境
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 (

5844

被折叠的 条评论
为什么被折叠?



