標籤:
前言
這是系列文章,它們由《編譯可在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"。
步驟1. 下載並安裝Android NDK
下載並安裝Android NDK的過程在這裡不做介紹。
下載gitlib
2. 安裝必要工具
- 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檔案。
3. 設定NDK和SYSROOT環境變數設定NDK環境變數
在"$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin"目錄中包含了arm-linux-androideabi-gcc、arm-linux-androideabi-g++等交叉編譯工具,不過交叉編譯工具的路徑根據NDK版本和編譯工具版本的不同會有所變化。
設定SYSROOT環境變數
SYSROOT表示一個目錄,該目錄中包含了目標的系統標頭檔和庫,在當前上下文語境中目標表示的是arm cpu架構。路徑中的"android-21"表示Android API層級,其中21表示的是Android5.0.1。
參考資料
本文使用Android NDK的工具進行交叉編譯,google官方參考資料:Standalone Toolchain,這篇文章詳細介紹了如何使用Android NDK工具進行交叉編譯。
4. 編譯依賴庫
libiconv
版本:1.14
編譯參考資料:編譯可在Android上啟動並執行libiconv庫
gettext
版本:0.19.7
編譯參考資料:編譯可在Android上啟動並執行gettext庫
pcre
版本:8.38
編譯參考資料:編譯可在Android上啟動並執行pcre庫
libffi
版本:3.2.1
編譯參考資料:編譯可在Android上啟動並執行libffi庫
5. 編寫android.cache
在glib源碼的根目錄下建立android.cache檔案,然後在該檔案中寫入下面的內容:
cache檔案的glib官方參考資料:Cross-compiling the GLib package。
6. 運行autogen.sh
在glib源碼根目錄下輸入命令:
該指令碼執行成功時,會產生一個名為"configure"的指令檔。
7. 運行configure
如果不添加CPP和CPPFLAGS則將會報這個錯誤:"configure: error: C preprocessor "/lib/cpp" fails sanity check"。
--host選項的值"arm-linux-androideabi"在configure指令碼中會被擴充成"arm-linux-androideabi-gcc"這樣的編譯工具名。
8. 編譯和安裝
使用make命令編譯源碼,當編譯成功是使用"make install"命令進行安裝,libiconv將會被安裝到${SYSROOT}/usr/lib目錄下,在上文中"--prefix="${SYSROOT}/usr"命令選項就是用來指定安裝的目錄的。
排錯configure.ac:88: error: possibly undefined macro: AC_DEFINE
問題
這是一個很模糊的問題我編譯glib時安裝了automake、libtool工具,卻還是提示這個錯誤。
解決辦法
我安裝了這些工具解決了這個辦法:autoconf,automake,autopoint,pkg-config。
但是具體是安裝了什麼庫解決了這個問題,我還不清楚。
解決辦法來源文章:
1、M Cross Bug 2 glib Build Fail #799:https://github.com/mxe/mxe/issues/799
2、http://mxe.cc/#requirements-debian
編譯可在Android上運行系列:
編譯可在Android上啟動並執行依賴庫(一):glib庫
編譯可在Android上啟動並執行依賴庫(二):gettext庫
編譯可在Android上啟動並執行依賴庫(三):libffi庫
編譯可在Android上啟動並執行依賴庫(四):libiconv庫
編譯可在Android上啟動並執行依賴庫(五):pcre庫
尋禹@阿里Mobile Security,更多技術文章,請訪問阿里聚安全部落格
系列篇|編譯可在Android上啟動並執行依賴庫(一):glib庫