title: libiconv交叉编译提示arm-none-linux-gnueabi-gcc

date: 2019/3/6 17:45:48

toc: true

libiconv交叉编译提示arm-none-linux-gnueabi-gcc

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iconv.h> int main(int argc, char **argv)
{
/* 目的编码, TRANSLIT:遇到无法转换的字符就找相近字符替换
* IGNORE :遇到无法转换字符跳过*/
//char *encTo = "UNICODE//TRANSLIT";
int i;
char *encTo = "UTF-8";
/* 源编码 */
char *encFrom = "GBK"; iconv_t cd = iconv_open (encTo, encFrom);
if (cd == (iconv_t)-1)
{
perror ("iconv_open");
return -1;
} /* 需要转换的字符串 */
// GBK D6D0 B9FA
// unicode 4E2D 56FD
// UTF-8 E4B8AD E59BBD
char inbuf[1024] = {0xD6,0xD0,0xB9,0xFA};
size_t srclen = strlen (inbuf);
/* 打印需要转换的字符串的长度 */
printf("srclen=%ld\n", srclen); i=0;
printf("input= ");
while (inbuf[i]) {
printf("%x ",(unsigned char)inbuf[i]);
i++;
}
printf("\n"); /* 存放转换后的字符串 */
size_t outlen = 1024;
char outbuf[outlen];
memset (outbuf, 0, outlen); /* 由于iconv()函数会修改指针,所以要保存源指针 */
char *srcstart = inbuf;
char *tempoutbuf = outbuf; /* 进行转换
*@param cd iconv_open()产生的句柄
*@param srcstart 需要转换的字符串
*@param srclen 存放还有多少字符没有转换
*@param tempoutbuf 存放转换后的字符串
*@param outlen 存放转换后,tempoutbuf剩余的空间
*
* */
size_t ret = iconv (cd, &srcstart, &srclen, &tempoutbuf, &outlen);
if (ret == -1)
{
perror ("iconv err\n");
return -1;
}
printf ("ret is %ld\n",ret);
printf ("outlen is %ld\n",1024-outlen); printf("out is \n");
for (i=0;i<10;i++) {
printf("%x ",(unsigned char)outbuf[i]);
}
printf("\n"); iconv_close (cd);
return 0;
}

最终显示结果

/mnt/repo/test/libiconv-1.15 #  ../arm
srclen=4
input= d6 d0 b9 fa
ret is 0
outlen is 6
out is
e4 b8 ad e5 9b bd 0 0 0 0

移植到ARM

1.14版本直接成功,1.15(最新)失败了,折腾了好久

先下载了最先的libiconv-1.15.tar.gz版本,解压配置

./configure --prefix=$PWD/out --host=arm-linux
make
make install

然后提示

arm-none-linux-gnueabi-gcc: 0": No such file or directory
<command-line>: warning: missing terminating " character
Makefile:50: recipe for target 'preloadable_libiconv.so' failed
make[1]: *** [preloadable_libiconv.so] Error 1
make[1]: Leaving directory '/home/book/stu/repo/test/libiconv-1.15/preload'
Makefile:33: recipe for target 'all' failed
make: *** [all] Error 2

查看下自己的编译工具,是有这个的arm-none-linux-gnueabi-gcc

book@100ask:~$ echo $PATH
/home/book/bin:/home/book/.local/bin:/opt/slickedit-pro2017/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm/4.3.2/bin/:/snap/bin
book@100ask:~$ book@100ask:~$ cd /usr/local/arm/4.3.2/bin/
book@100ask:/usr/local/arm/4.3.2/bin$ ls
arm-linux-addr2line arm-linux-gcc arm-linux-nm arm-linux-strings arm-none-linux-gnueabi-cpp arm-none-linux-gnueabi-gprof arm-none-linux-gnueabi-size
arm-linux-ar arm-linux-gcc-4.3.2 arm-linux-objcopy arm-linux-strip arm-none-linux-gnueabi-g++ arm-none-linux-gnueabi-ld arm-none-linux-gnueabi-sprite
arm-linux-as arm-linux-gcov arm-linux-objdump arm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-gcc arm-none-linux-gnueabi-nm arm-none-linux-gnueabi-strings
arm-linux-c++ arm-linux-gdb arm-linux-ranlib arm-none-linux-gnueabi-ar arm-none-linux-gnueabi-gcc-4.3.2 arm-none-linux-gnueabi-objcopy arm-none-linux-gnueabi-strip
arm-linux-c++filt arm-linux-gdbtui arm-linux-readelf arm-none-linux-gnueabi-as arm-none-linux-gnueabi-gcov arm-none-linux-gnueabi-objdump
arm-linux-cpp arm-linux-gprof arm-linux-size arm-none-linux-gnueabi-c++ arm-none-linux-gnueabi-gdb arm-none-linux-gnueabi-ranlib
arm-linux-g++ arm-linux-ld arm-linux-sprite arm-none-linux-gnueabi-c++filt arm-none-linux-gnueabi-gdbtui arm-none-linux-gnueabi-readelf book@100ask:/usr/local/arm/4.3.2/bin$ ls arm-none-linux-gnueabi-gcc
arm-none-linux-gnueabi-gcc

网上搜素一圈都说安装一个库,然而都安装补上了

sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0

后来找到这里,指定CC然后make就好了

./configure --prefix=$PWD/out --host=arm-linux CC=/usr/local/arm/4.3.2/bin/arm-linux-gcc

总结

./configure --prefix=$PWD/out --host=arm-linux CC=/usr/local/arm/4.3.2/bin/arm-linux-gcc
make
make install 然后复制到单板的lib下
cp out/lib/preloadable_libiconv.so /lib/
配置动态库
export LD_PRELOAD=/lib/preloadable_libiconv.so
# 卸载这个动态库,如果要删除so,需要先卸载
unset LD_PRELOAD

LD_PRELOAD 使用

  1. 定义与目标函数完全一样的函数,包括名称、变量及类型、返回值及类型等
  2. 将包含替换函数的源码编译为动态链接库
  3. 通过命令 export LD_PRELOAD="库文件路径",设置要优先替换动态链接库
  4. 如果找不替换库,可以通过 export LD_LIBRARY_PATH=库文件所在目录路径,设置系统查找库的目录
  5. 替换结束,要还原函数调用关系,用命令unset LD_PRELOAD 解除
  6. 想查询依赖关系,可以用ldd 程序名称

LD_PRELOAD,是个环境变量,用于动态库的加载,动态库加载的优先级最高,一般情况下,其加载顺序为LD_PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib。

参考文档

arm移植libiconv(字符编码转换) https://blog.csdn.net/dyzhen/article/details/50864419

LD_PRELOAD的偷梁换柱之能 https://www.cnblogs.com/net66/p/5609026.html

libiconv交叉编译提示arm-none-linux-gnueabi-gcc的更多相关文章

  1. CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中

    CentOS7中_带sqlite3_CGO的golang程序_交叉编译到arm中 转载注明来源: 本文链接 来自osnosn的博客,写于 2019-10-28. 编写了个golang程序,用到了这个C ...

  2. 详解Linux安装GCC方法

    转载自:http://blog.csdn.net/bulljordan23/article/details/7723495/ 下载: http://ftp.gnu.org/gnu/gcc/gcc-4. ...

  3. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之一

    /** ****************************************************************************** * @author    暴走的小 ...

  4. Linux安装gcc时碰到的有关问题解决(解决gcc依赖有关问题)

    Linux安装gcc时碰到的有关问题解决(解决gcc依赖有关问题) rpm安装gcc时碰到的有关问题解决(解决gcc依赖有关问题) 提示:error: Failed dependencies: clo ...

  5. 为你详解Linux安装GCC方法

    下载: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.bz2浏览: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/查 ...

  6. arm 开发板更新 gcc/gcc++ | Debain 更新 gcc,无需编译直接更新 gcc

    4我的板子是 Orange pi 3,只能以 卧槽来形容... 我是搞.net core的,这板子死活搞不了. 刷的是Debain系统. 说实话,这个板子不错,可就是官方的系统实在不敢恭维,内核旧,软 ...

  7. arm驱动linux异步通知与异步IO【转】

    转自:http://blog.csdn.net/chinazhangzhong123/article/details/51638793 <[ arm驱动] linux异步通知与 异步IO> ...

  8. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二

    /** ****************************************************************************** * @author    暴走的小 ...

  9. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三

    /** ****************************************************************************** * @author    暴走的小 ...

随机推荐

  1. 轨迹系列4——WebGIS中使用ZRender实现轨迹前端动态播放特效

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在地图上以时间轴方式播放人员.车辆在地图上的历史行进 ...

  2. 原 js实现数据持久化

    在写js事件时,常常遇到点击一个事件,然后在若干时间以后需要知道最近一次点击的事件的结点.比如这里: 我点击树节点1,再点击tab2,然后我再来回切换tab,假如最后一次点击tab时在tab2上,这时 ...

  3. zabbix监控交换机状态

    1.在Zabbix中添加主机 输入名称.群组和交换机IP(交换机要开启snmp) 2.创建监控项 输入OID和其它信息(键值随便填,但是不能和系统内的键值重复)OID获取方法可查看上一篇文章:http ...

  4. Ubuntu 16.04 安装GIMP绘图软件

    Ubuntu上比较好用的绘图软件,GIMP,安装方法如下: 终端输入 : sudo apt-get install gimp ,回车,输入密码,即可安装简单易行. 输入 :gimp ,启动程序.

  5. javascript基础之对象

    老师的博客:https://www.cnblogs.com/liwenzhou/p/8004649.html#autoid-1-8-6 JavaScript中的所有事物都是对象:字符串.数字.数组.日 ...

  6. 如何在element-UI 组件的change事件中传递自定义参数

    以select为例,如果select写在循环里,触发change事件时可能不只需要传递被选中项的值,还要传递index过去,来改变同一循环中的其他标签的状态. 下面这样写是无效的: @change=& ...

  7. 在Linux系统安装Nodejs 最简单步骤

    1.去官网下载和自己系统匹配的文件: 英文网址:https://nodejs.org/en/download/ 中文网址:http://nodejs.cn/download/ 通过  uname -a ...

  8. CentOS7 安装配置 MySQL 5.7

    1. 下载 yum 源文件 mysql80-community-release-el7-2.noarch.rpm https://dev.mysql.com/downloads/repo/yum/ 2 ...

  9. 身边有个漂亮的java女程序员是什么体验?

    程序员都是一些追求完美的人.女程序员细致认真,不仅能写代码而且注释详尽清晰.能做好单元测试BUG最少.能写标准规范的设计文件不会对不上模块编号也不会少了类或接口说明,提交代码不会忘记写LOG,不会和测 ...

  10. CentOS7.x安装MySQL5.7.25

    mysql 5.7下载地址 社区版下载地址:https://dev.mysql.com/downloads/mysql/ 可能会有变动 找到5.7版本, 注:源码安装需要用到下面的包,可以先忽略,我安 ...