最近在做一個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: