編譯可在Android上運行的glib庫

編譯可在Android上運行的glib庫

@(Android研究)[android|glib]html


[TOC]linux


本文公開首發於阿里聚安全博客:https://jaq.alibaba.com/community/index.htm?spm=0.0.0.0.ycEUXKandroid

前言

這是系列文章,它們由《編譯可在Android上運行的glib庫》及其餘4篇文章組成,這4篇文章在「編譯依賴庫」一節中列出。因爲glib庫依賴於其餘第三方庫,因此須要先將依賴的第三方庫交叉編譯到Android平臺上才能成功的編譯glib庫,系列文章中除《編譯可在Android上運行的glib庫》外的其餘交叉編譯文章均是介紹如何對glib依賴庫進行交叉編譯。以上,因此叫系列文章,由於這些文章完整的介紹瞭如何編譯可在Android上運行的glib庫。git

文章價值github

這些文章的核心價值是Android平臺的交叉編譯經驗和提供了新的編譯方式。有些人把linux庫移植到Android上的時候將makefile翻譯爲Android.mk文件(據我所知有很多人都是這樣作的),而使用本文中的方法能夠直接利用原有的makefile文件進行交叉編譯。shell

編譯環境安全

本文在Ubuntu 64位系統上對glib項目進行交叉編譯。架構

約定ide

下文中的"NDK"若無特殊說明均指"Android NDK"。工具

步驟

1. 下載並安裝Android NDK

下載並安裝Android NDK的過程在這裏不作介紹。

下載gitlib

git clone https://github.com/GNOME/glib.git

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環境變量

export NDK=<NDK目錄>
export PATH=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH

在"$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin"目錄中包含了arm-linux-androideabi-gcc、arm-linux-androideabi-g++等交叉編譯工具,不過交叉編譯工具的路徑根據NDK版本和編譯工具版本的不一樣會有所變化。

設置SYSROOT環境變量

export SYSROOT="$NDK/platforms/android-21/arch-arm"

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文件,而後在該文件中寫入下面的內容:

glib_cv_long_long_format=ll
glib_cv_stack_grows=no
glib_cv_uscore=no
ac_cv_func_posix_getpwuid_r=no
ac_cv_func_posix_getgrgid_r=no

cache文件的glib官方參考資料:Cross-compiling the GLib package

6. 運行autogen.sh

在glib源碼根目錄下輸入命令:

./autogen.sh

該腳本執行成功時,會生成一個名爲"configure"的腳本文件。

7. 運行configure

CPP="arm-linux-androideabi-gcc -E" CPPFLAGS="-I${SYSROOT}/usr/include" CFLAGS="-fPIC -pic" CXXFLAGS="-fPIC -pic" LDFLAGS="-fPIC -pic" ./configure --prefix="${SYSROOT}/usr" --host=arm-linux-androideabi --cache-file=android.cache CFLAGS="--sysroot $SYSROOT" --enable-static

若是不添加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

問題

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
相關文章
相關標籤/搜索