Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3167930
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: LINUX

2014-11-20 11:11:46

原文地址:http://blog.csdn.net/manfeel/article/details/38881469

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 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




阅读(4045) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~