<b>編譯可在android上運作的依賴庫(一):glib庫</b>
<b></b>
<b>作者:尋禹@阿裡聚安全</b>
這是系列文章,它們由《編譯可在android上運作的glib庫》及其他4篇文章組成,這4篇文章在“編譯依賴庫”一節中列出。由于glib庫依賴于其他第三方庫,是以需要先将依賴的第三方庫交叉編譯到android平台上才能成功的編譯glib庫,系列文章中除《編譯可在android上運作的glib庫》外的其他交叉編譯文章均是介紹如何對glib依賴庫進行交叉編譯。以上,是以叫系列文章,因為這些文章完整的介紹了如何編譯可在android上運作的glib庫。
文章價值
這些文章的核心價值是android平台的交叉編譯經驗和提供了新的編譯方式。有些人把linux庫移植到android上的時候将makefile翻譯為android.mk檔案(據我所知有不少人都是這樣做的),而使用本文中的方法可以直接利用原有的makefile檔案進行交叉編譯。
編譯環境
本文在ubuntu 64位系統上對glib項目進行交叉編譯。
約定
下文中的"ndk"若無特殊說明均指"android ndk"。
下載下傳并安裝android ndk的過程在這裡不做介紹。
下載下傳gitlib
gnu autoconf 2.62
gnu automake 1.11
gnu libtool 2.2
gnu gettext 0.10.40
pkg-config 0.16
gtk-doc
libffi 3.0.0
關于編譯glib項目要安裝的工具可以參考glib源碼根目錄下的hacking檔案。
在"$ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin"目錄中包含了arm-linux-androideabi-gcc、arm-linux-androideabi-g++等交叉編譯工具,不過交叉編譯工具的路徑根據ndk版本和編譯工具版本的不同會有所變化。
sysroot表示一個目錄,該目錄中包含了目标的系統頭檔案和庫,在目前上下文語境中目标表示的是arm cpu架構。路徑中的"android-21"表示android api級别,其中21表示的是android5.0.1。
libiconv
版本:1.14
gettext
版本:0.19.7
pcre
版本:8.38
libffi
版本:3.2.1
在glib源碼的根目錄下建立android.cache檔案,然後在該檔案中寫入下面的内容:
在glib源碼根目錄下輸入指令:
該腳本執行成功時,會生成一個名為"configure"的腳本檔案。
如果不添加cpp和cppflags則将會報這個錯誤:"configure: error: c preprocessor "/lib/cpp" fails sanity check"。
--host選項的值"arm-linux-androideabi"在configure腳本中會被擴充成"arm-linux-androideabi-gcc"這樣的編譯工具名。
使用make指令編譯源碼,當編譯成功是使用"make install"指令進行安裝,libiconv将會被安裝到${sysroot}/usr/lib目錄下,在上文中"--prefix="${sysroot}/usr"指令選項就是用來指定安裝的目錄的。
排錯
問題
這是一個很模糊的問題我編譯glib時安裝了automake、libtool工具,卻還是提示這個錯誤。
解決辦法
我安裝了這些工具解決了這個辦法:autoconf,automake,autopoint,pkg-config。
但是具體是安裝了什麼庫解決了這個問題,我還不清楚。
解決辦法來源文章:
阿裡聚安全由阿裡巴巴移動安全部出品,面向企業和開發者提供企業安全解決方案,全面覆寫移動安全、資料風控、内容安全、實人認證等次元,并在業界率先提出“以業務為中心的安全”,賦能生态,與行業共享阿裡巴巴集團多年沉澱的專業安全能力。