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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章