全部博文(685)
分类: LINUX
2014-11-20 11:11:46
2.Package oled is missing dependencies for the following libraries: libiconv.so.2
从字面意思分析,当前编译的包缺少libiconv.so.2的支持。这个错误也好解决,在Makefile的DEPENDS中加上+libiconv即可,或者,更优雅的做法是:
DEPENDS:=+libstdcpp $(ICONV_DEPENDS)
最近在做一个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 fullifeq ($(CONFIG_BUILD_NLS),y)ICONV_PREFIX:=$(STAGING_DIR)/usr/lib/libiconv-full
ICONV_FULL:=1INTL_PREFIX:=$(STAGING_DIR)/usr/lib/libintl-full
INTL_FULL:=1# iconv stubelse
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_NLSPKG_BUILD_DEPENDS += !BUILD_NLS:libiconv !BUILD_NLS:libintlICONV_DEPENDS:=+BUILD_NLS:libiconv-fullICONV_CFLAGS:=-I$(ICONV_PREFIX)/includeICONV_CPPFLAGS:=-I$(ICONV_PREFIX)/includeICONV_LDFLAGS:=-L$(ICONV_PREFIX)/lib
INTL_DEPENDS:=+BUILD_NLS:libintl-fullINTL_CFLAGS:=-I$(INTL_PREFIX)/includeINTL_CPPFLAGS:=-I$(INTL_PREFIX)/includeINTL_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 --->
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供大家参考:
顺便贴出我的“万能”Makefile: