ARM开发板上iconv_open(utf-8, gb2312) 调用失败的解决方法(转)

ARM开发板上iconv_open("utf-8", "gb2312") 调用失败的解决方法

 

应用程序代码如下:
static int code_convert(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 == -1)
    {
        perror("iconv_open:");
        return -1;
    }

    memset(outbuf,0,outlen);
    if (iconv(cd, pin, &inlen, pout, &outlen) == -1)
    {
        //printf("%s: call iconv failed!\n", __FUNCTION__);
        printf("errno=%d\n", errno);
        perror("iconv failed:\n");
        iconv_close(cd);
        return -1;
    }
    iconv_close(cd);
    return 0;
}

static int g2u(char* inbuf, size_t inlen, char* outbuf, size_t outlen)
{
    return code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, outlen);
}

开发环境为ubuntu11.10,开发板为ARM开发板,交叉编译器版本为arm-linux-4.4.3.
相同的C源程序,在ubuntu11.10上能够正常执行,而在ARM开发板则不能正常执行,调用
iconv_open("utf-8", "gb2312") 返回失败,错误信息为“Invalid argument”.
经过查询资料得知iconv相关函数为libc中的函数,初步分析得出结论为有可能是libc版本中
iconv相关函数的版本不同造成的,因此要更新iconv相关函数。
更新iconv相关函数有两种方法:
第一,更新libc库;
第二,更新libiconv库。

第一种方法更新libc库比较麻烦,因为我们用的是编译好的交叉编译器,这中方法需要重新编译生成

交叉编译器,并且也需要使用新编译生成的交叉编译工具重新编译应用程序,因此本方法代价太大,

采用第二种方法。

第二种方法为只更新libiconv库,到iconv官网下载最新的库源码包,下载地址为:
http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz
解压后得到libiconv目录,阅读该目录下Readme文件得出,编译安装libiconv库也有两种方式:
This library can be built and installed in two variants:

  - The library mode. This works on all systems, and uses a library
    `libiconv.so' and a header file `<iconv.h>'. (Both are installed
    through "make install".)

    To use it, simply #include <iconv.h> and use the functions.

    To use it in an autoconfiguring package:
    - If you don't use automake, append m4/iconv.m4 to your aclocal.m4
      file.
    - If you do use automake, add m4/iconv.m4 to your m4 macro repository.
    - Add to the link command line of libraries and executables that use
      the functions the placeholder @LIBICONV@ (or, if using libtool for
      the link, @LTLIBICONV@). If you use automake, the right place for
      these additions are the *_LDADD variables.
    Note that 'iconv.m4' is also part of the GNU gettext package, which
    installs it in /usr/local/share/aclocal/iconv.m4.

  - The libc plug/override mode. This works on GNU/Linux, Solaris and OSF/1
    systems only. It is a way to get good iconv support without having
    glibc-2.1.
    It installs a library `preloadable_libiconv.so'. This library can be used
    with LD_PRELOAD, to override the iconv* functions present in the C library.

    On GNU/Linux and Solaris:
        $ export LD_PRELOAD=/usr/local/lib/preloadable_libiconv.so

    On OSF/1:
        $ export _RLD_LIST=/usr/local/lib/preloadable_libiconv.so:DEFAULT

    A program's source need not be modified, the program need not even be
    recompiled. Just set the LD_PRELOAD environment variable, that's it!

我在ARM开发板上采用“The libc plug/override mode”实验成功,下面介绍编译过程:
在libiconv目录下:
$./configure --prefix=$PWD/out --host=arm-linux
$make
$make install

上述命令执行完成后会在libiconv目录下生成新的out目录,该目录下存在4个目录分别是:
bin include lib share

在lib目录下为生成的库文件,其中一个为preloadable_libiconv.so,把它下载到开发板
的lib目录下,然后再设置开发板的系统环境变量:
$ export LD_PRELOAD=/lib/preloadable_libiconv.so

然后再执行应用程序即可,正常运行。

转载于:https://www.cnblogs.com/Charles-Zhang-Blog/archive/2013/05/09/3068941.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux c语言获取时间

在程序中&#xff0c;经常需要输出系统的当前时间、计算程序的执行时间、使用计时器等。 一、时间的类型 1.格林威治标准时间 coordinated universal time(UTC)是世界标准时间&#xff0c;即常说的格林威治标准时间(greenwich mean time,GMT). 2.日历时间 日历时间(calendar ti…

source insight快捷键及使用技巧

source insight快捷键及使用技巧 退出程序 : AltF4 重画屏幕 : CtrlAltSpace 完成语法 : CtrlE 复制一行 : CtrlK 恰好复制该位置右边的该行的字符 :…

Crosstool-ng制作交叉编译工具链

Crosstool-ng制作交叉编译工具链 交叉编译器可以用现成的&#xff0c;比如CodeSourcery制作的交叉编译器&#xff0c;也可以自己制作&#xff0c;一般是用kernelgccglibcbinutils的源码包来编译安装&#xff0c;后来由于这个太麻烦于是就有类似crosstool这样的自动化配置工具。…

数学建模之聚类模型详解

聚类模型 引言 “物以类聚&#xff0c;人以群分”&#xff0c;所谓的聚类&#xff0c;就是将样本划分为由类似的对象组成的多个类的过程。聚类后&#xff0c;我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测&#xff1b;也可以探究不同类之间的相关性和主…

嵌入式Linux启动过程中的问题积累

嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Number OMAP5912 OSK # &#xff08;tftp下载好kernel的uImage后就停止在这&#xff0c;不能启动kernel&#xff09; 问题原因&#xff1a;启动参数设置错误,…

使用BusyBox制作嵌入式Linux根文件系统

STEP 1&#xff1a;构建目录结构 创建根文件系统目录&#xff0c;主要包括以下目录/dev /etc /lib /usr /var /proc /tmp /home /root /mnt /bin /sbin /sys #mkdir /home/rootfs#cd /home/rootfs #mkdir dev etc lib usr var proc tmp home root …

Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用

Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用 在串口编程模式下&#xff0c;open未设置O_NONBLOCK或O_NDELAY的情况下。 c_cc[VTIME]和c_cc[VMIN]映像read函数的返回。 VTIME定义等待的时间&#xff0c;单位是百毫秒(通常是一个8位的unsigned char变量&#xff0c;取值不能…

Linux_2.6字符设备驱动实例

第一步&#xff1a;my74hc595.c #include <linux/module.h> //模块所需的大量符号和函数定义#include <linux/init.h> //指定初始化和清除函数#include <linux/fs.h> //文件系统相关的函数和头文件#include <linux/cdev.h> //cdev结构的头文件#include…

移植mysql到嵌入式ARM平台

移植MySQL到嵌入式ARM平台 MySQL没有专门针对ARM的版本&#xff0c;移植到ARM没有官方文档可参考&#xff0c;因此&#xff0c;暂时参考这样一篇文档&#xff1a; http://blog.chinaunix.net/space.php?uid9701860&doblog&id285428&#xff0c;因为MySQL5.5之后&…

'./mysql-bin.index' not found (Errcode: 13) 的解决方法

将文件系统复制到PC机上&#xff0c;然后再拷贝到别的SD卡后&#xff0c;发现mysql无法启动了&#xff0c;首先检查了一下mysql的错误日志&#xff0c;发现最后出现以下错误&#xff1a;/usr/local/mysql/libexec/mysqld: File ./mysql-bin.index not found (Errcode: 13)提示.…

Unity Hub安装Android Build Support报错:Failed to delete old Unity Android Supprtinstallation files

安装失败&#xff1a; 解决方法&#xff1a; 需要先安装 Android Build Support &#xff0c;再安装 Android SDK & NDK Tools 和 OpenJDK 其他情况&#xff1a; 如果已经安装了Android SDK & NDK Tools 和 OpenJDK&#xff0c;只剩Android Build Support 未安装成功…

红米5 Plus刷开发版/小米手机刷开发版

到官网选择对应手机型号下载Rom包&#xff1a;MIUI下载 下载完成后手机打开&#xff1a;设置→我的设备→MIUI版本→右上角选择【手动选择安装包】&#xff0c;找到下载的包等待手机重启就行了。 PS&#xff1a;如果是像下面这样 小米手机找不到手动选择安装包 选项的话&#…

小米手机开启Root权限

1.开启权限前手机先要刷成开发版&#xff0c;可以看 → 小米手机刷开发版 2.设备解锁&#xff0c;先在 设置→我的设备→全部参数→开启开发者模式→多击MIUI版本 开启开发者模式&#xff0c;然后进入 设置→更多设置→开发者选项→设备解锁状态 &#xff0c;根据操作提示解锁…

小米手机Linux Deploy安装Ubuntu

1.Linux Deploy 2.4版本之后无需再安装Busy Box&#xff0c;所以BusyBox安装报错失败的不需要再安装了。直接GooglePlay下载inux Deploy最新版进行安装即可&#xff0c;或 点击此处下载。 2.下载安装Linux Deploy之后进行Ubuntu的安装。 我的配置如下&#xff1a; 引导设置&a…

Linux Deploy Ubuntu安装samba服务

1.更新软件源&#xff1a;sudo apt-get update 2.安装samba服务&#xff1a;sudo apt-get install samba 3.备份原配置文件&#xff1a;sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak 4.创建共享目录&#xff1a;sudo mkdir -p /共享文件夹路径 5.更新目录权限&…

摄像头监控录像保存到手机(旧手机/废弃手机)本文使用手机为红米Note5 Plus

本文为使用旧手机安装linux Ubuntu系统之后安装samba服务&#xff0c;用作NAS网络存储&#xff0c;需要摄像头软件可以将录像保存至NAS。 1.手机需要先开启 Root权限&#xff0c;小米手机可参考&#xff1a;小米手机开启Root权限-CSDN博客 2.小米手机正常开启的Root权限不是完整…

通过Blender将PMX模型转为FBX导入Unity

一、下载Blender&#xff08;建议2.83版本不要太高的&#xff09; 官网下载网址&#xff1a;Blender 2.83 LTS — blender.org 二、之后安装Blender&#xff0c;安装后下载插件 下载地址&#xff1a;https://codeload.github.com/GiveMeAllYourCats/cats-blender-plugin/zip/…

Git理论、原理、操作

Git理论、原理、操作 Git简介&#xff1a; 一个开源的分布式版本控制系统。用于处理任何大大小小的项目&#xff0c;是一个开放源码的版本控制软件。Git与SVG的区别&#xff1a; 1、git是分布式的 2、git把内容按元数据方式存储&#xff0c;svg按文件 3、git分支和svg分支不同…

我在Facebook的十点经验分享[转载]

转载自 http://blog.sina.com.cn/s/blog_70c9335b010144kc.html 我是2007年初加入Facebook, 那时大概150人; 2011年9月底离开, 当时3200多人. 经历了很多稀奇古怪但影响很大的项目, 像Application Platform, Social Ads, News Feed, Gift Shop, Facebook Credits等等. 碰到的很…

Android中让Service被关闭后再重新启动

2019独角兽企业重金招聘Python工程师标准>>> --------------------------------------------------------------------------- 转载&#xff1a;http://blog.csdn.net/arui319 --------------------------------------------------------------------------- 如何做…