![Androidmakefile編譯系統(tǒng)Androidmk文件語(yǔ)法規(guī)范_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe1.gif)
![Androidmakefile編譯系統(tǒng)Androidmk文件語(yǔ)法規(guī)范_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe2.gif)
![Androidmakefile編譯系統(tǒng)Androidmk文件語(yǔ)法規(guī)范_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe3.gif)
![Androidmakefile編譯系統(tǒng)Androidmk文件語(yǔ)法規(guī)范_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe4.gif)
![Androidmakefile編譯系統(tǒng)Androidmk文件語(yǔ)法規(guī)范_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe/5f9bbf48-7dc3-442c-b7c1-83fa314f3dbe5.gif)
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Introduction:Android.mk編譯文件是用來向AndroidNDK描述你的C,C+源代碼文件的,這篇文檔描述了它的語(yǔ)法。在閱讀下面的內(nèi)容之前,假定你已經(jīng)閱讀了docs/OVERVIEW.TXT文件,了解了它們的腳色和用途。一、概述一個(gè)Android.mkfile用來向編譯系統(tǒng)描述你的源代碼。具體來說:(1)該文彳是GNUMakefile的一小部分,會(huì)被編譯系統(tǒng)解析一次或更多次的build系統(tǒng)。因此,您應(yīng)盡量減少您聲明的變量,不要認(rèn)為某些變量在解析過程中不會(huì)被定義。(2)這個(gè)文件的語(yǔ)法允許把你的源代碼組織成模塊,一個(gè)模塊屬下列類型之一:1)靜態(tài)庫(kù)2)共享庫(kù),且只有共享庫(kù)將被安裝/
2、復(fù)制到您的應(yīng)用軟件包,雖然靜態(tài)庫(kù)能被用于生成共享庫(kù)。你可以在每一個(gè)Android.mkfile中定義一個(gè)或多個(gè)模塊,你也可以在幾個(gè)模塊中使用同一個(gè)源代碼文件。(1)編譯系統(tǒng)為你處理許多細(xì)節(jié)問題。例如,你不需要在你的Android.mk中列出頭文件和依賴文件。NDK編譯系統(tǒng)將會(huì)為你自動(dòng)處理這些問題。這也意味著,在升級(jí)NDK后,你應(yīng)該得到新的toolchain/platform支持,而且不需要改變你的Android.mk文件。注意,這個(gè)語(yǔ)法同公開發(fā)布的Android平臺(tái)的開源代碼很接近,然而編譯系統(tǒng)實(shí)現(xiàn)他們的方式卻是不同的,這是故意這樣設(shè)計(jì)的,可以讓程序開發(fā)人員重用外部庫(kù)的源代碼更容易。在描述語(yǔ)法
3、細(xì)節(jié)之前,咱們來看一個(gè)簡(jiǎn)單的"helloworld"的例子,比如,下面的文件:sources/helloworld/helloworld.csources/helloworld/Android.mk'helloworld.c'是一個(gè)JNI共享庫(kù),實(shí)現(xiàn)返回"helloworld"字符串的原生方法。相應(yīng)的Android.mk文件會(huì)象下面這樣:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=helloworldLOCAL_SRC_FILES:=helloworld.cincl
4、ude$(BUILD_SHARED_LIBRARY)好,我們來解釋一下這幾行代碼:LOCAL_PATH:=$(callmy-dir)一個(gè)Android.mkfile首先必須定義好LOCAL_PATH變量。它用于在開發(fā)樹中查找源文件。在這個(gè)例子中,宏函數(shù)?my-dir?,由編譯系統(tǒng)提供,用于返回當(dāng)前路徑(即包含Android.mkfile文件的目錄)。include$(CLEAR_VARS)CLEAR_VARS由編譯系統(tǒng)提供,指定讓GNUMAKEFILE為你清除許多LOCAL_XXX變量(例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,
5、等等.),除LOCAL_PATH。這是必要的,因句所有而編譯控制文件而在同一個(gè)GNUMAKE執(zhí)行環(huán)境中,所有白森量都是全局的。LOCAL_MODULE:=helloworldLOCAL_MODULE變量必須定義,以標(biāo)識(shí)你在Android.mk文件中描述的每個(gè)模塊。名稱必須是唯一的,而且不包含任何空格。注意編譯系統(tǒng)會(huì)自動(dòng)產(chǎn)生合適的前綴和后綴,換句話說,一個(gè)被命名為foo的共享庫(kù)模塊,將會(huì)生成libfoo.so'文件。重要注意事項(xiàng):如果你把庫(kù)命名為,libhelloworld?,編譯系統(tǒng)將不會(huì)添加任何的lib前綴,也會(huì)生成libhelloworld.so,這是為了支持來源于Android平
6、臺(tái)的源代碼的Android.mk文件,如果你確實(shí)需要這么做的話。LOCAL_SRC_FILES:=helloworld.cLOCAL_SRC_FILES變量必須包含將要編譯打包進(jìn)模塊中的C或C+源代碼文件。注意,你不用在這里列出頭文件和包含文件,因?yàn)榫幾g系統(tǒng)將會(huì)自動(dòng)為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好。【注意,默認(rèn)的C+源碼文件的擴(kuò)展名是?.cpp?.指定一個(gè)不同的擴(kuò)展名也是可能的,只要定義LOCAL_DEFAULT_CPP_EXTENSION變量,不要忘記開始的小圓點(diǎn)(也就是定義為,.cxx?,而不是,cxx?)(當(dāng)然這一步我們一般不會(huì)去改它)include$(BU
7、ILD_SHARED_LIBRARY)BUILD_SHARED_LIBRARY是編譯系統(tǒng)提供的變量,指向一個(gè)GNUMakefile腳本(應(yīng)該就是在build/core目錄下的shared_library.mk),負(fù)責(zé)收集自從上次調(diào)用'include$(CLEAR_VARS)'以來,定義在LOCAL_XXX變量中的所有信息,并且決定編譯什么,如何正確地去做。并根據(jù)其規(guī)則生成靜態(tài)庫(kù)。同理對(duì)于靜態(tài)庫(kù)。在sources/samples目錄下有更復(fù)雜一點(diǎn)的例子,寫有注釋的Android.mk文件,你可以看看。一分",一、爹苦這是一份你應(yīng)該在Android.mk中依賴或定義的變量
8、列表,您可以定義其他變量為自己使用,但是NDK編譯系統(tǒng)保留下列變量名:- 以LOCAL_開頭的名字(例如LOCAL_MODULE)- 以PRIVATE_,NDK_orAPP_開頭的名字(內(nèi)部使用)- 小寫名字(內(nèi)部使用,例如?my-dir?)如果您為了方便在Android.mk中定義自己的變量,我們建議使用MY_前綴,一個(gè)小例子:MY_SOURCES:=foo.cifneq($(MY_CONFIG_BAR),)endifLOCAL_SRC_FILES+=$(MY_SOURCES)1. GNUMake變量這些GNUMake變量在你的Android.mk文件解析之前,就由編譯系統(tǒng)定義好了。注意在某
9、些情況下,NDK可能分析Android.mk幾次,每一次某些變量的定義會(huì)有不同。(1) CLEAR_VARS:指向一個(gè)編譯腳本,幾乎所有未定義的LOCAL_XXX變量都在"Module-description"節(jié)中列出。你必須在開始一個(gè)新模塊之前包含這個(gè)腳本。include$(CLEAR_VARS)(2) BUILD_SHARED_LIBRARY:指向編譯腳本,收集所有的你在LOCAL_XXX變量中提供的信息,并且決定如何把你列出的源代碼文件編譯成一個(gè)共享庫(kù)。注意,你必須至少在包含這個(gè)文件之前定義LOCAL_MODULE和LOCAL_SRC_FILES,使用例子:inclu
10、de$(BUILD_SHARED_LIBRARY)(注意這將生成一個(gè)名為lib$(LOCAL_MODULE).so的文件)(3) BUILD_STATIC_LIBRARY:一個(gè)BUILD_SHARED_LIBRARY變量用于編譯一個(gè)靜態(tài)庫(kù)。靜態(tài)庫(kù)不會(huì)復(fù)制到你的project/packages中,但是能夠用于編譯共享庫(kù),(看下面描述的LOCAL_STATIC_LIBRARIESandLOCAL_STATIC_WHOLE_LIBRARIES)使用例子:include$(BUILD_STATIC_LIBRARY)(注意,這將會(huì)生成一個(gè)名為lib$(LOCAL_MODULE).a的文件)。(4) TA
11、RGET_ARCH:目標(biāo)CPU平臺(tái)的名字,和android開放源碼中指定的那樣。如果是arm,表示要生成ARM兼容的指令,與CPU架構(gòu)的修訂版無關(guān)。(5) TARGET_PLATFORM:Android.mk解析的時(shí)候,目標(biāo)Android平臺(tái)的名字.詳情可參考/development/ndk/docs/stable-apis.txt.android-3->OfficialAndroid1.5systemimagesandroid-4->OfficialAndroid1.6systemimagesandroid-5->OfficialAndroid2.0systemimages
12、(6) TARGET_ARCH_ABI:暫時(shí)只支持兩個(gè)value,armeabi和armeabi-v7a。在現(xiàn)在的版本中一般把這兩個(gè)值簡(jiǎn)單的定義為arm,通過android平臺(tái)內(nèi)部對(duì)它重定義來獲得更好的匹配。其他的ABI將在以后的NDK版本中介紹,它們會(huì)有不同的名字。注意所有基于ARM的ABI者B會(huì)把'TARGET_ARCH'定義成,arm?,但是會(huì)有不同的,TARGET_ARCH_ABI?(7) TARGET_ABI:目標(biāo)平臺(tái)和ABI的組合,它事實(shí)上被定義成$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI)在你想要在真實(shí)的設(shè)備中針對(duì)一個(gè)特別的目標(biāo)系統(tǒng)進(jìn)
13、行測(cè)試時(shí),會(huì)有用。在默認(rèn)的情況下,它會(huì)是android-3-arm'。2.模塊描述變量下面的變量用于向編譯系統(tǒng)描述你的模塊。你應(yīng)該定義在'include$(CLEAR_VARS)'和'include$(BUILD_XXXXX)'之間。正如前面描寫的那樣,$(CLEAR_VARS是一個(gè)腳本,清除所有這些變量,除非在描述中顯式注明。(1) LOCAL_PATH:這個(gè)變量用于給出當(dāng)前文件的路徑。你必須在Android.mk的開頭定義,可以這樣使用:LOCAL_PATH:=$(callmy-dir)這個(gè)變量不會(huì)被$(CLEAR_VARS)清除,因此每個(gè)Andro
14、id.mk只需要定義一次(即使你在一個(gè)文件中定義了幾個(gè)模塊的情況下)。(2) LOCAL_MODULE:這是你模塊的名字,它必須是唯一的,而且不能包含空格。你必須在包含任一的$(BUILD_XXXX)腳本之前定義它。模塊的名字決定了生成文件的名字,例如,如果一個(gè)一個(gè)共享庫(kù)模塊的名字是,那么生成文件的名字就是lib.so。但是,在你的NDK生成文件中(或者Android.mk或者Application.mk),你應(yīng)該只涉及(引用)有正常名字的其他模塊。(3) LOCAL_SRC_FILES:這是要編譯的源代碼文件列表。只要列出要傳遞給編譯器的文件,因?yàn)榫幾g系統(tǒng)自動(dòng)為你計(jì)算依賴。注意源代碼文件名稱
15、都是相對(duì)于LOCAL_PATH的,你可以使用路徑部分,例如:LOCAL_SRC_FILES:=foo.ctoto/bar.c注意:在生成文件中都要使用UNIX風(fēng)格的斜杠(/).windows風(fēng)格的反斜杠不會(huì)被正確的處理。(4) LOCAL_CPP_EXTENSION:這是一個(gè)可選變量,用來指定C+代碼文件的擴(kuò)展名,默認(rèn)是'.cpp',但是你可以改變它,比如:LOCAL_CPP_EXTENSION:=.cxx(5) LOCAL_C_INCLUDES:路徑的可選配置,是從根目錄開始的,allsources(C,C+andAssembly).Forexample:LOCAL_C_IN
16、CLUDES:=sources/fooOreven:LOCAL_C_INCLUDES:=$(LOCAL_PATH)/./foo需要在任何包含LOCAL_CFLAGS/LOCAL_CPPFLAGS標(biāo)志之前。(6) LOCAL_CFLAGS:可選的編譯器選項(xiàng),在編譯C代碼文件的時(shí)候使用。這可能是有用的,指定一個(gè)附加的包含路徑(相對(duì)于NDK的頂層目錄),宏定義,或者編譯選項(xiàng)。重要信息:不要在Android.mk中改變optimization/debugging級(jí)別,只要在Application.mk中指定合適的信息,就會(huì)自動(dòng)地為你處理這個(gè)問題,在調(diào)試期間,會(huì)讓NDK自動(dòng)生成有用的數(shù)據(jù)文件。(7)LO
17、CAL_CXXFLAGS:SameasLOCAL_CFLAGSforC+sourcefiles(8) LOCAL_CPPFLAGS:與LOCAL_CFLAGS相同,但是對(duì)C和C+sourcefiles者B適用。(9) LOCAL_STATIC_LIBRARIES:應(yīng)該鏈接到這個(gè)模塊的靜態(tài)庫(kù)列表(使用BUILD_STATIC_LIBRARY生成),這僅僅對(duì)共享庫(kù)模塊才有意義。(10) LOCAL_SHARED_LIBRARIES:這個(gè)模塊在運(yùn)行時(shí)要依賴的共享庫(kù)模塊列表,在鏈接時(shí)需要,在生成文件時(shí)嵌入的相應(yīng)的信息。注意:這不會(huì)附加列出的模塊到編譯圖,也就是,你仍然需要在Application.mk
18、中把它們添加到程序要求的模塊中。(11) LOCAL_LDLIBS:編譯你的模塊要使用的附加的鏈接器選項(xiàng)。這對(duì)于使用“-l'前綴傳遞指定庫(kù)的名字是有用的。例如,下面將告訴鏈接器生成的模塊要在加載時(shí)刻鏈接到/system/lib/libz.soLOCAL_LDLIBS:=-lz看docs/STABLE-APIS.TXT獲取你使用NDK發(fā)行版能鏈接到的開放的系統(tǒng)庫(kù)列表。(13) LOCAL_ALLOW_UNDEFINED_SYMBOLS:默認(rèn)情況下,在試圖編譯一個(gè)共享庫(kù)時(shí),任何未定義的引用將導(dǎo)致一個(gè)朱定義的符號(hào)”錯(cuò)誤。這對(duì)于在你的源代碼文件中捕捉錯(cuò)誤會(huì)有很大的幫助。然而,如果你因?yàn)槟承┰?/p>
19、,需要不啟動(dòng)這項(xiàng)檢查,把這個(gè)變量設(shè)為,true?。注意相應(yīng)的共享庫(kù)可能在運(yùn)行時(shí)加載失敗。(這個(gè)一般盡量不要去設(shè)為true)(14) LOCAL_ARM_MODE:默認(rèn)情況下,arm目標(biāo)二進(jìn)制會(huì)以thumb的形式生成(16位),你可以通過設(shè)置這個(gè)變量為arm如果你希望你的module是以32位指令的形式。'arm'(32-bitinstructions)mode.E.g.:(15) LOCAL_ARM_MODE:=arm注意你同樣可以在編譯的時(shí)候告訴系統(tǒng)編譯特定的類型,比如(16) LOCAL_SRC_FILES:=foo.cbar.c.arm這樣就告訴系統(tǒng)總是將bar.c以ar
20、m的模式編譯,下面是GNUMake,功能?宏,必須通過使用$(call)'來求值,他們返回文本化的信息。(17) my-dir:返回當(dāng)前Android.mk所在的目錄路徑,相對(duì)于NDK編譯系統(tǒng)的頂層。這是有用的,在Android.mk文件的開頭如此定義:LOCAL_PATH:=$(callmy-dir)(18) all-subdir-makefiles:返回一個(gè)位于當(dāng)前'my-dir'路徑的子目錄列表。例如,看下面的目錄層次:sources/foo/Android.mksources/foo/lib1/Android.mksources/foo/lib2/Android
21、.mk如果sources/foo/Android.mk包含一行:include$(callall-subdir-makefiles)那么它就會(huì)自動(dòng)包含sources/foo/lib1/Android.mk和sources/foo/lib2/Android.mk。這項(xiàng)功能用于向編譯系統(tǒng)提供深層次嵌套的代碼目錄層次。注意,在默認(rèn)情況下,NDK將會(huì)只搜索在sources/*/Android.mk中的文件。(19) this-makefile:返回當(dāng)前Make巾le的路徑(即這個(gè)函數(shù)調(diào)用的地方)(20) parent-makefile:返回調(diào)用樹中父Makefile路徑。即包含當(dāng)前Makefile的M
22、akefile路徑。(21) grand-parent-makefile猜猜看.3.Android.mk使用模板在一個(gè)Android.mk中可以生成多個(gè)可執(zhí)行程序、動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)。(1)編譯應(yīng)用程序的模板:#TestExeLOCAL_PATH:=$(callmy-dir)#include$(CLEAR_VARS)LOCAL_SRC_FILESkmain.cLOCAL_MODULE:=test_exe#LOCAL_C_INCLUDES:=#LOCAL_STATIC_L舊RARIES:=#LOCAL_SHARED_LIBRARIES:=include$(BUILD_EXECUTABLE)(菜鳥級(jí)別
23、解釋:k是賦值的意思,$是引用某變量的值)LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES中加入所需要包含的頭文件路徑,LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態(tài)庫(kù)(*.a)的名稱,LOCAL_SHARED_LIBRARIES中力口入所需要鏈接的動(dòng)態(tài)庫(kù)(*.so)的名稱,LOCAL_MODULE表示模塊最終的名稱,BUILD_EXECUTABLE表示以一個(gè)可執(zhí)行程序的方式進(jìn)行編譯。(2)編譯靜態(tài)庫(kù)的模板:#TestStaticLibLOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_SRC_FILES:=helloworld.cLOCAL_MODULE:=libtest_static#LOCAL_C_INCLUDES:=#LOCAL_STATIC_LIBRARIES:=#LOCAL_SHARED_LIBRARIES:=include$(BUILD_STATIC_LIBRARY)一般的和上面相似,BUILD_STATIC_LIBRARY表示編譯一個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度草莓苗種植基地農(nóng)業(yè)觀光合作合同
- 《桂林山水》課件
- 二零二五年度消防設(shè)施安全評(píng)估與整改合同3篇
- 二零二五年度苗木種植與園林園藝人才培養(yǎng)合作合同
- 二零二五年度臍橙產(chǎn)品電商平臺(tái)合作推廣合同4篇
- 《系統(tǒng)工程緒論》課件
- 《小兒體格檢查》課件
- 《管理咨詢?nèi)腴T》課件
- 《思維導(dǎo)圖上課》課件
- 企業(yè)薪酬與福利管理報(bào)告
- 數(shù)學(xué)-河南省三門峽市2024-2025學(xué)年高二上學(xué)期1月期末調(diào)研考試試題和答案
- 2025年春新人教版數(shù)學(xué)七年級(jí)下冊(cè)教學(xué)課件
- 《心臟血管的解剖》課件
- 心肺復(fù)蘇課件2024
- 2024-2030年中國(guó)并購(gòu)基金行業(yè)發(fā)展前景預(yù)測(cè)及投資策略研究報(bào)告
- 河道清淤安全培訓(xùn)課件
- 2024各科普通高中課程標(biāo)準(zhǔn)
- 7.3.1印度(第1課時(shí))七年級(jí)地理下冊(cè)(人教版)
- 教師培訓(xùn)校園安全
- 北師大版語(yǔ)文四年級(jí)下冊(cè)全冊(cè)教案
- 《湖南師范大學(xué)》課件
評(píng)論
0/150
提交評(píng)論