1. 程式人生 > >用NDK在Ubuntu14.04上安裝arm交叉編譯環境

用NDK在Ubuntu14.04上安裝arm交叉編譯環境

之前沒有接觸過交叉編譯,後來因為在實驗室要在機器人上跑arm程式,所以就嘗試著用Ubuntu來編譯arm的程式,自己上網查方法並諮詢了很多同學同事,最終搭建成功了這個交叉編譯環境。

由於NDK中帶有一整套arm的gcc和g++編譯器,庫和檔案,所以用NDK安裝更加的方便。

1. 下載NDK安裝包

有VPN或者是用hosts訪問外網的人可以訪問

如果沒有科學上網工具的話,就只能自己百度上找了,我自己是在學校的bt站下載的 android-ndk-r10e-linux-x86_64.bin

2. 解壓NDK安裝包

將bin檔案拷貝到Ubuntu的某一個資料夾下,比如/home/xf/

在控制檯中的該資料夾路徑下執行chmod +x android-ndk-r10e-linux-x86_64.bin 控制檯會打印出一對解壓資料引數,如果電腦容量不足,會報錯,如果成功會顯示everything is ok

3. 配置環境變數

修改環境變數有很多方式,我們這裡修改/etc/profile來控制環境變數。

sudo vim /etc/profile

在profile檔案的尾部新增

export NDK=/home/xf/android-ndk-r10e-linux #這裡的資料夾是我的NDK解壓目錄
export SYSROOT=$NDK/platforms/android-18/arch-arm #android-18是android開發版本

之後執行

source /etc/profile

就可以在當前執行source的控制檯中使用這些環境變量了

4. toolchain目錄的建立

在剛才執行source的terminal中執行

$NDK/build/tools/make-standalone-toolchain.sh –platform=android-18 –install-dir=/home/xf/AndroidToolChain

其中--platform是安裝的交叉編譯環境的安卓版本號,--install是要將交叉編譯環境安裝到的目錄,這個目錄最好寫絕對路徑,我曾經把這個目錄寫成~/AndroidToolChain

,結果它在我的使用者空間中建了一個~資料夾,裡面建了一個AndroidToolChain資料夾,沒有正確的將~識別為使用者空間根目錄。

如果上面的語句出錯,提示

Unable to auto-config arch from toolchain

說明需要手動配置

vim $NDK/build/tools/make-standalone-toolchain.sh

將其中第一個TOOLCHAIN_NAME改成

TOOLCHAIN_NAME=arm-linux-androideabi-4.9

之後再執行,上面的語句就可以了。成功之後,就可以在AndroidToolChain中看到交叉編譯工具了。

5. 配置交叉編譯環境變數

交叉編譯工具安裝好了之後,我們需要使用它,我習慣於將其新增到環境變數中,這樣可以在系統的任何地方呼叫它,不過著看個人喜好。
/etc/profile中新增如下語句並執行source /etc/profile

export ANDROIDPATH=/home/xf/AndroidToolChain
export SYSROOT=$ANDROIDPATH/sysroot
export ANDROIDBIN=$ANDROIDPATH/bin
export ANDROIDLIB=$SYSROOT/usr/lib
export PATH=$PATH:$ANDROIDPATH:$ANDROIDBIN:$SYSROOT
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ANDROIDLIB

上面的語句不一定都是必須的,不過我也沒有測試哪些是無用的。
至此交叉編譯環境就已經安裝成功了。

6. 測試

隨便找一個目錄測試一下

vim test.cpp

在test.cpp檔案中輸入

#include<iostream>
using namespace std;
int main()
{
    cout<<"helloword"<<endl;
}

再執行

arm-linux-androideabi-g++ test.cpp

在當前資料夾會生成一個a.out檔案

file a.out

控制檯會顯示

a.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), not stripped

則表示編譯成功。