天天看點

編譯可在Android上運作的依賴庫(二):gettext庫

編譯可在android上運作的依賴庫(二):gettext庫

作者:尋禹@阿裡聚安全

gettext版本:0.19.7。

本文在ubuntu 64位系統上對gettext項目進行交叉編譯。

下文中的"ndk"若無特殊說明均指"android ndk"。

<b>注意:</b>不要運作gettext源碼目錄下的autogen.sh檔案。如果先運作autogen.sh然後運作configure再然後使用make指令編譯時,編譯會出錯。

如果不安裝這些工具編譯時将出錯。

automake-1.15

必須安裝1.15版本。

下載下傳後需要編譯安裝,指令:

編譯可在Android上運作的依賴庫(二):gettext庫

texinfo

在unbuntu中安裝texinfo。

下載下傳并安裝android ndk的過程在這裡不做介紹。

請參考《編譯可在android上運作的glib庫》中相應的步驟。

請參考《編譯可在android上運作的libiconv庫》中的相應步驟。

編譯可在Android上運作的依賴庫(二):gettext庫

--host選項的值"arm-linux-eabi"在configure腳本中會被擴充成"arm-linux-eabi-gcc"這樣的編譯工具名。--host選項的值必須包含在軟連結的名字中,舉例,如果有個軟連結名為arm-linux-eabi-gcc,那麼--host選項的值就必須是arm-linux-eabi;如果有個軟連結名為arm-linux-eabiabc-gcc,那麼--host選項的值就必須是arm-linux-eabiabc。

ldflags指向的目錄是gettext編譯輸出的目錄,如果不添加這個目錄,在gettext安裝時将會報"error: cannot find -lgettextlib"這個錯誤,在下面“編譯問題排錯”一節有對這個錯誤進行解析。

cpp指定c預處理器,其中的"-e"指令選項是必須,如果沒有這個指令選項将會報出下面的錯誤:

編譯可在Android上運作的依賴庫(二):gettext庫

奇怪的是,我在linux上不指定cpp和cppflags宏進行編譯不會報上面的錯誤,而在mac osx系統上不指定cpp和cppflags宏就會報上面的錯誤。

使用make指令編譯源碼,當編譯成功是使用"make install"指令進行安裝,gettext将會被安裝到${sysroot}/usr/lib目錄下,在上文中"--prefix="${sysroot}/usr"指令選項就是用來指定安裝的目錄的。

編譯時可能會報下面的錯誤:

編譯可在Android上運作的依賴庫(二):gettext庫

源碼:

編譯可在Android上運作的依賴庫(二):gettext庫

簡單修複:

編譯可在Android上運作的依賴庫(二):gettext庫

錯誤資訊:

編譯可在Android上運作的依賴庫(二):gettext庫
編譯可在Android上運作的依賴庫(二):gettext庫
編譯可在Android上運作的依賴庫(二):gettext庫
編譯可在Android上運作的依賴庫(二):gettext庫
編譯可在Android上運作的依賴庫(二):gettext庫
編譯可在Android上運作的依賴庫(二):gettext庫

這個錯誤在編譯gettext時不會發生,而會在執行make install的時候發生,它會找不到libgettextlib.a這個庫。當編譯成功時,libgettextlib.a這個庫是會生成的,這個庫的路徑在這個目錄中:&lt;gettext源碼目錄&gt;/gettext-tools/gnulib-lib/.libs/,将這個路徑添加到configure指令行的庫搜尋路徑中,上面的configure的指令行選項中設定了這個目錄。

<b>注意:</b>如果出現這個錯誤需要先使用"make clean &amp;&amp; make distclean"指令清理項目,然後再将gettext庫路徑添加到configure指令行的庫搜尋路徑中。

阿裡聚安全由阿裡巴巴移動安全部出品,面向企業和開發者提供企業安全解決方案,全面覆寫移動安全、資料風控、内容安全、實人認證等次元,并在業界率先提出“以業務為中心的安全”,賦能生态,與行業共享阿裡巴巴集團多年沉澱的專業安全能力。

繼續閱讀