系列篇|編譯可在Android上啟動並執行依賴庫(一):glib庫

來源:互聯網
上載者:User

標籤:

 

前言

這是系列文章,它們由《編譯可在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庫

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.