Android開發實踐 如何設定NDK的編譯選項

2021-07-26 07:52:40 字數 3542 閱讀 3727

1. 概述

android.mk,負責配置如下內容:

(1) 模組名(local_module)

(2) 需要編譯的原始檔(local_src_files)

(3) 依賴的第三方庫(local_static_libraries,local_shared_libraries)

(4) 編譯/鏈結選項(local_ldlibs、local_cflags)

(2) toolchains(預設值:gcc 4.8)

(4) release/debug模式(預設值:release)

由上述定義可以判斷,abi定義了規則,而具體的實現則是由編譯器、cpu、作業系統共同來完成的。不同的cpu晶元(如:arm、intel x86、mips)支援不同的abi架構,常見的abi型別包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。

這就是為什麼我們編譯出來的可以執行於windows的二進位制程式不能執行於mac os/linux/android平台了,因為cpu晶元和作業系統均不相同,支援的abi型別也不一樣,因此無法識別對方的二進位制程式。

而我們所說的「交叉編譯」的核心原理也跟這些密切相關,交叉編譯,就是使用交叉編譯工具,在乙個平台上編譯生成另乙個平台上的二進位制可執行程式,為什麼可以做到?因為交叉編譯工具實現了另乙個平台所定義的abi規則。我們在windows/linux平台使用android ndk交叉編譯工具來編譯出android平台的庫也是這個道理。

這裡給出最新 android ndk 所支援的abi型別及區別:

//只編譯armeabi-v7a版本

//同時編譯armeabi,armeabi-v7a版本

//編譯所有版本

3. local_ldlibs

android ndk 除了提供了bionic libc庫,還提供了一些其他的庫,可以在 android.mk 檔案中通過如下方式新增依賴:

1

local_ldlibs := -lfoo

其中,如下幾個庫在 android ndk 編譯時就預設鏈結了,不需要額外新增在 local_ldlibs 中:

(1) bionic libc庫

(2) pthread庫(-lpthread)

(3) math(-lmath)

(4) c++ support library (-lstdc++)

下面我列了乙個表,給出了可以新增到「local_ldlibs」中的不同版本的android ndk所支援的庫:

我們可以在 android.mk 檔案中設定 local_cflags 來為編譯源**新增額外的編譯選項,由於ndk實際上也是呼叫gcc命令來完成編譯和鏈結的,因此,local_cflags 的可選引數配置大家可以參考gcc的官方文件,鏈結如下:

《gcc 4.8.4 manual》

《gcc command options》

下面是我總結的一些常用的cflags編譯選項:

(1)通用的編譯選項

-o2  編譯優化選項,一般選擇o2,兼顧了優化程度與目標大小

-wall  開啟所有編譯過程中的warning

-fpic  編譯位置無關的**,一般用於編譯動態庫

-shared 編譯動態庫

-fopenmp 開啟多核平行計算,

-idir 配置標頭檔案搜尋路徑,如果有多個-i選項,則路徑的搜尋先後順序是從左到右的,即在前面的路徑會被選搜尋

-nostdinc 該選項指示不要標準路徑下的搜尋標頭檔案,而只搜尋-i選項指定的路徑和當前路徑。

--sysroot=dir 用dir作為標頭檔案和庫檔案的邏輯根目錄,例如,正常情況下,如果編譯器在/usr/include搜尋標頭檔案,在/usr/lib下搜尋庫檔案,它將用dir/usr/include和dir/usr/lib替代原來的相應路徑。

-llibrary 查詢名為library的庫進行鏈結

-ldir 增加-l選項指定的庫檔案的搜尋路徑,即編譯器會到dir路徑下搜尋-l指定的庫檔案。

-nostdlib 該選項指示鏈結的時候不要使用標準路徑下的庫檔案

(2) arm平台相關的編譯選項

-marm -mthumb 二選一,指定編譯thumb指令集還是arm指令集

-march=name  指定特定的arm架構,常用的包括:-march=armv6, -march=armv7-a

-mfpu=name   給出目標平台的浮點運算處理器型別,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16

-mfloat-abi=name 給出目標平台的浮點預算abi,支援的引數包括:「soft」, 「softfp」 and 「hard」 1

預設情況下,system 庫只支援部分 stl 的功能,不支援c++異常,不支援rtti,不過,ndk 整合了一系列其他的c++執行時庫,可以提供這些功能,這些庫的特性如下所示:

Android開發實踐 如何設定NDK的編譯選項

1.概述 android.mk,負責配置如下內容 1 模組名 local module 2 需要編譯的原始檔 local src files 3 依賴的第三方庫 local static libraries,local shared libraries 4 編譯 鏈結選項 local ldlibs ...

Android測試驅動開發實踐

在android應用開發中,相信很少有人在堅持先由設計人員做完整的概要設計 詳細設計,然後交給程式設計師進行編碼實現了。通常是在有乙個大體框架的情況下,就開始進行具體編碼開發了。在這種情形下,開發速度可以有很大的提高,但是最終 質量卻不可避免的降低了。如何能既保持開發速度,同時又能保證開發質量呢?相...

Svn使用實踐 android開發

a svn 分為主幹和分支。主幹用途 常規的 提交了,主要是新功能的提交。分支 分為發布分支,實驗性分支。發布分支用途 乙個版本到開發後期,新需求已不能提交到發布分支上。只能用於修復bug。而敏捷開發中,新功能的開發和bug 的修復通常是同期進行的。b 提交細則 乙個版本的開發主要有以下過程 一 新...