OpenWrt中又见 iconv 错误

最近在做一个OpenWrt上的OLED显示屏项目,使用UCDOS提供的hzk16作为项目的字库。因为UCDOS的汉字库编码为GB2312,因而需要使用libiconv进行编码转换。正是这个依赖于libiconv的动作,却让编译的项目出现了错误。经过仔细的分析与总结,将中间出现的问题以及解决的办法做个记录,让同样出现此种问题的童鞋少走弯路。

1.最初的问题很直接:找不到iconv.h

我们知道,iconv.h由package libiconv提供。libiconv在OpenWrt中有两个版本:一个是简化的libiconv,一个是完全的libiconv-full(实际上支持并不完整,参见我的另一篇文章)。这个问题比较好解决,可以用手工的“笨”办法,加入iconv.h所在的路径,当然,还有一个聪明的办法,那就是包含nls.mk文件,在CFLAGS、CPPFLAGS、LDFLAGS中包含ICONV_CFLAGS等相关变量定义。nls.mk文件很简单,相信我列出其中的内容后,读者朋友就会有恍然大悟的感觉。

# iconv full
ifeq ($(CONFIG_BUILD_NLS),y)
    ICONV_PREFIX:=$(STAGING_DIR)/usr/lib/libiconv-full
    ICONV_FULL:=1
 
    INTL_PREFIX:=$(STAGING_DIR)/usr/lib/libintl-full
    INTL_FULL:=1
 
# iconv stub
else
    ICONV_PREFIX:=$(STAGING_DIR)/usr/lib/libiconv-stub
    ICONV_FULL:=
 
    INTL_PREFIX:=$(STAGING_DIR)/usr/lib/libintl-stub
    INTL_FULL:=
endif
 
PKG_CONFIG_DEPENDS += CONFIG_BUILD_NLS
PKG_BUILD_DEPENDS += !BUILD_NLS:libiconv !BUILD_NLS:libintl
 
ICONV_DEPENDS:=+BUILD_NLS:libiconv-full
ICONV_CFLAGS:=-I$(ICONV_PREFIX)/include
ICONV_CPPFLAGS:=-I$(ICONV_PREFIX)/include
ICONV_LDFLAGS:=-L$(ICONV_PREFIX)/lib
 
INTL_DEPENDS:=+BUILD_NLS:libintl-full
INTL_CFLAGS:=-I$(INTL_PREFIX)/include
INTL_CPPFLAGS:=-I$(INTL_PREFIX)/include
INTL_LDFLAGS:=-L$(INTL_PREFIX)/lib
 
TARGET_CFLAGS += $(ICONV_CFLAGS) $(INTL_CFLAGS)
TARGET_CPPFLAGS += $(ICONV_CFLAGS) $(INTL_CPPFLAGS)
TARGET_LDFLAGS += $(ICONV_LDFLAGS) $(INTL_LDFLAGS)

CONFIG_BUILD_NLS定义在Global build settings  --->

image

2.Package oled is missing dependencies for the following libraries: libiconv.so.2

从字面意思分析,当前编译的包缺少libiconv.so.2的支持。这个错误也好解决,在Makefile的DEPENDS中加上+libiconv即可,或者,更优雅的做法是:

DEPENDS:=+libstdcpp $(ICONV_DEPENDS)

3.窃以为经过上面两个错误的修正之后,后面应该是阳光大道了,没想到更加棘手的问题却在前方如猛虎一般扑了出来:

graphics.o: In function `code_convert(char*, char*, char*, unsigned int, char*, unsigned int)':
graphics.cpp:(.text+0x3338): undefined reference to `libiconv_open'
graphics.cpp:(.text+0x33b0): undefined reference to `libiconv'
graphics.cpp:(.text+0x33dc): undefined reference to `libiconv_close'
collect2: error: ld returned 1 exit status

很简单明了的提示,但找到这个错误的解决办法却颇费周折,网上对这个错误的解决思路语焉不详。只有自己通过grep在feeds目录中查找包含了iconv的项目,还真找出来很多。我注意到了一个细节:里面有-liconv,果断的加入这个参数。再次编译通过!

贴出oled package的Makefile供大家参考:

image

顺便贴出我的“万能”Makefile:

image

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值