本文是我的《Android NDK開(kāi)發(fā)》系列的又一篇文章,上篇文章中,我分享了一個(gè)可以自動(dòng)添加源文件列表的 Android.mk 示例模板,方便大家快速地搭建起完整的 NDK 開(kāi)發(fā)工程框架,本文則主要探究幾個(gè)主要的 NDK 編譯選項(xiàng)的配置,其中包括:APP_ABI、LOCAL_LDLIBS、LOCAL_CFLAGS、APP_STL 這幾項(xiàng),讓你從此不再對(duì) NDK 的編譯參數(shù)望而生卻。
創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的龍川網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!1. 概述
首先回顧一下 Android NDK 開(kāi)發(fā)中,Android.mk 和 Application.mk 各自的職責(zé)。
Android.mk,負(fù)責(zé)配置如下內(nèi)容:
(1) 模塊名(LOCAL_MODULE)
(2) 需要編譯的源文件(LOCAL_SRC_FILES)
(3) 依賴的第三方庫(kù)(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES)
(4) 編譯/鏈接選項(xiàng)(LOCAL_LDLIBS、LOCAL_CFLAGS)
Application.mk,負(fù)責(zé)配置如下內(nèi)容:
(1) 目標(biāo)平臺(tái)的ABI類型(默認(rèn)值:armeabi)(APP_ABI)
(2) Toolchains(默認(rèn)值:GCC 4.8)
(3) C++標(biāo)準(zhǔn)庫(kù)類型(默認(rèn)值:system)(APP_STL)
(4) release/debug模式(默認(rèn)值:release)
由此我們可以看到,本文所涉及的編譯選項(xiàng)在Android.mk和Application.mk中均有出現(xiàn),下面我們將一個(gè)個(gè)詳細(xì)介紹。
2. APP_ABI
ABI全稱是:Application binary interface,即:應(yīng)用程序二進(jìn)制接口,它定義了一套規(guī)則,允許編譯好的二進(jìn)制目標(biāo)代碼在所有兼容該ABI的操作系統(tǒng)和硬件平臺(tái)中無(wú)需改動(dòng)就能運(yùn)行。(具體的定義請(qǐng)參考 百度百科 或者 維基百科 )
由上述定義可以判斷,ABI定義了規(guī)則,而具體的實(shí)現(xiàn)則是由編譯器、CPU、操作系統(tǒng)共同來(lái)完成的。不同的CPU芯片(如:ARM、Intel x86、MIPS)支持不同的ABI架構(gòu),常見(jiàn)的ABI類型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。
這就是為什么我們編譯出來(lái)的可以運(yùn)行于Windows的二進(jìn)制程序不能運(yùn)行于Mac OS/Linux/Android平臺(tái)了,因?yàn)镃PU芯片和操作系統(tǒng)均不相同,支持的ABI類型也不一樣,因此無(wú)法識(shí)別對(duì)方的二進(jìn)制程序。
而我們所說(shuō)的“交叉編譯”的核心原理也跟這些密切相關(guān),交叉編譯,就是使用交叉編譯工具,在一個(gè)平臺(tái)上編譯生成另一個(gè)平臺(tái)上的二進(jìn)制可執(zhí)行程序,為什么可以做到?因?yàn)榻徊婢幾g工具實(shí)現(xiàn)了另一個(gè)平臺(tái)所定義的ABI規(guī)則。我們?cè)赪indows/Linux平臺(tái)使用Android NDK交叉編譯工具來(lái)編譯出Android平臺(tái)的庫(kù)也是這個(gè)道理。
這里給出最新 Android NDK 所支持的ABI類型及區(qū)別:
那么,如何指定ABI類型呢?在 Application.mk 文件中添加一行即可:
APP_ABI := armeabi-v7a //只編譯armeabi-v7a版本 APP_ABI := armeabi armeabi-v7a //同時(shí)編譯armeabi,armeabi-v7a版本 APP_ABI := all //編譯所有版本
3. LOCAL_LDLIBS
Android NDK 除了提供了Bionic libc庫(kù),還提供了一些其他的庫(kù),可以在 Android.mk 文件中通過(guò)如下方式添加依賴:
LOCAL_LDLIBS := -lfoo
其中,如下幾個(gè)庫(kù)在 Android NDK 編譯時(shí)就默認(rèn)鏈接了,不需要額外添加在 LOCAL_LDLIBS 中:
(1) Bionic libc庫(kù)
(2) pthread庫(kù)(-lpthread)
(3) math(-lmath)
(4) C++ support library (-lstdc++)
下面我列了一個(gè)表,給出了可以添加到“LOCAL_LDLIBS”中的不同版本的Android NDK所支持的庫(kù):
4. LOCAL_CFLAGS
我們可以在 Android.mk 文件中設(shè)置 LOCAL_CFLAGS 來(lái)為編譯源代碼添加額外的編譯選項(xiàng),由于NDK實(shí)際上也是調(diào)用GCC命令來(lái)完成編譯和鏈接的,因此,LOCAL_CFLAGS 的可選參數(shù)配置大家可以參考GCC的官方文檔,鏈接如下:
《GCC 4.8.4 Manual》
《GCC Command Options》
下面是我總結(jié)的一些常用的CFLAGS編譯選項(xiàng):
(1)通用的編譯選項(xiàng)
-O2 編譯優(yōu)化選項(xiàng),一般選擇O2,兼顧了優(yōu)化程度與目標(biāo)大小
-Wall 打開(kāi)所有編譯過(guò)程中的Warning
-fPIC 編譯位置無(wú)關(guān)的代碼,一般用于編譯動(dòng)態(tài)庫(kù)
-shared 編譯動(dòng)態(tài)庫(kù)
-fopenmp 打開(kāi)多核并行計(jì)算,
-Idir 配置頭文件搜索路徑,如果有多個(gè)-I選項(xiàng),則路徑的搜索先后順序是從左到右的,即在前面的路徑會(huì)被選搜索
-nostdinc 該選項(xiàng)指示不要標(biāo)準(zhǔn)路徑下的搜索頭文件,而只搜索-I選項(xiàng)指定的路徑和當(dāng)前路徑。
--sysroot=dir 用dir作為頭文件和庫(kù)文件的邏輯根目錄,例如,正常情況下,如果編譯器在/usr/include搜索頭文件,在/usr/lib下搜索庫(kù)文件,它將用dir/usr/include和dir/usr/lib替代原來(lái)的相應(yīng)路徑。
-llibrary 查找名為library的庫(kù)進(jìn)行鏈接
-Ldir 增加-l選項(xiàng)指定的庫(kù)文件的搜索路徑,即編譯器會(huì)到dir路徑下搜索-l指定的庫(kù)文件。
-nostdlib 該選項(xiàng)指示鏈接的時(shí)候不要使用標(biāo)準(zhǔn)路徑下的庫(kù)文件
(2) ARM平臺(tái)相關(guān)的編譯選項(xiàng)
-marm -mthumb 二選一,指定編譯thumb指令集還是arm指令集
-march=name 指定特定的ARM架構(gòu),常用的包括:-march=armv6, -march=armv7-a
-mfpu=name 給出目標(biāo)平臺(tái)的浮點(diǎn)運(yùn)算處理器類型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16
-mfloat-abi=name 給出目標(biāo)平臺(tái)的浮點(diǎn)預(yù)算ABI,支持的參數(shù)包括:“soft”, “softfp” and “hard”
5. APP_STL
從Android NDK r5 開(kāi)始支持 STL 了,只需要在 Application.mk 文件中添加對(duì) APP_STL 的定義即可:
APP_STL := gnustl_static
默認(rèn)情況下,system 庫(kù)只支持部分 STL 的功能,不支持C++異常,不支持RTTI,不過(guò),NDK 集成了一系列其他的C++運(yùn)行時(shí)庫(kù),可以提供這些功能,這些庫(kù)的特性如下所示:
我們可以通過(guò)修改 Application.mk文件中的 APP_STL 來(lái)配置到底選擇使用哪一種C++支持庫(kù):
system -> Use the default minimal system C++ runtime library. gabi++_static -> Use the GAbi++ runtime as a static library. gabi++_shared -> Use the GAbi++ runtime as a shared library. stlport_static -> Use the STLport runtime as a static library. stlport_shared -> Use the STLport runtime as a shared library. gnustl_static -> Use the GNU STL as a static library. gnustl_shared -> Use the GNU STL as a shared library.
6. 小結(jié)
關(guān)于如何設(shè)置NDK的編譯選項(xiàng)就介紹到這兒了,有任何疑問(wèn),歡迎留言或者來(lái)信lujun.hust@gmail.com交流,也可以關(guān)注我的新浪微博 @盧_俊 或者微信公眾號(hào) @Jhuster 獲取最新的文章和資訊。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前題目:Android開(kāi)發(fā)實(shí)踐:如何設(shè)置NDK的編譯選項(xiàng)-創(chuàng)新互聯(lián)
路徑分享:http://www.rwnh.cn/article8/csjgip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、品牌網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
移動(dòng)網(wǎng)站建設(shè)知識(shí)