【原创】64位Linux下交叉编译 iconv到arm 32位使用

编译环境

  • Host: Ubuntu 20.04 x86_64 64位
  • Target: RK1126 armv7l 32位

在RK1126 系统上默认使用iconv进行编码转换时,在调用iconv_open时返回-1, 原因是系统中可能没有集成 iconv的转换库,于是自己动手编译使用

编译过程

1、下载交叉编译工具
Arm Developer 下载对应目标32位的编译工具链
在这里插入图片描述
解压后设置环境变量,修改 ~/.bashrc 最后添加

export PATH=/home/xxx/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin:$PATH

使用 source ~/.bashrc 生效

使用arm-none-linux-gnueabihf-gcc -v 确认是否生效
在这里插入图片描述
2、下载iconv
到 https://ftp.gnu.org/gnu/libiconv/ 下载最新源码
在这里插入图片描述
解压后编译, gcc配置为刚刚设置的, 同时生成静态库和动态库

./configure --prefix=$PWD/out CC=arm-none-linux-gnueabihf-gcc -host=arm-linux --enable-shared -enable-static
make 
make install

不出意外,编译成功,会在out目录下生成对应的lib和include文件,这些都是我们需要的。
在这里插入图片描述
在这里插入图片描述

集成

集成到项目中时,有以下几种方式。 一定要注意头文件和对应的.so/.a 文件都要拷贝。 代码中也要将 #include <iconv.h>修改成 #include “iconv.h”
1、集成静态库.a
将生成的libcharset.a 和libiconv.a 和对应的include文件放到项目目录中:
在这里插入图片描述
修改Makefile

PRO_PATH = $(shell pwd)
CFLAGS += -I$(PRO_PATH)/iconv/include
LDFLAGS := -L$(PRO_PATH)/iconv/libs -liconv -lcharset

也可以使用下面的方式直接指定静态库的绝对路径, 用的比较少

LDFLAGS := -L$(PRO_PATH)/iconv/libs -l:libiconv.a -l:libcharset.a

其中 -L 指定库搜索的路径,后面再加具体要引用的库
注意:如果libs目录下同时有动态库和静态库,会优先使用动态库;如果想强制使用静态,可以加 -static, 但我尝试后所有的库都会优先静态,这不是我想要的
深入阅读:How to include static library in makefile

2、集成动态库so, 这种方式的弊端是需要拷贝so系统中,在实际的生产中会比较麻烦
3、另外一种方式使用 LD_PRELOAD集成到系统, 类似方式2

Reference:

UTF-8与GBK字符之间的转换
unicode2gbk编码表
嵌入式使用自带的iconv库utf-8转gbk失败,移植libiconv库解决
ubuntu18.04 交叉编译器arm-none-linux-gnueabi-gcc 安装

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值