天天看點

編譯可在Android上運作的依賴庫(一):glib庫

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

但是具體是安裝了什麼庫解決了這個問題,我還不清楚。

解決辦法來源文章:

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

繼續閱讀