Androidmakefile編譯系統(tǒng)Androidmk文件語法規(guī)范_第1頁
Androidmakefile編譯系統(tǒng)Androidmk文件語法規(guī)范_第2頁
Androidmakefile編譯系統(tǒng)Androidmk文件語法規(guī)范_第3頁
Androidmakefile編譯系統(tǒng)Androidmk文件語法規(guī)范_第4頁
Androidmakefile編譯系統(tǒng)Androidmk文件語法規(guī)范_第5頁
免費預(yù)覽已結(jié)束,剩余3頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、Introduction:Android.mk編譯文件是用來向AndroidNDK描述你的C,C+源代碼文件的,這篇文檔描述了它的語法。在閱讀下面的內(nèi)容之前,假定你已經(jīng)閱讀了docs/OVERVIEW.TXT文件,了解了它們的腳色和用途。一、概述一個Android.mkfile用來向編譯系統(tǒng)描述你的源代碼。具體來說:(1)該文彳是GNUMakefile的一小部分,會被編譯系統(tǒng)解析一次或更多次的build系統(tǒng)。因此,您應(yīng)盡量減少您聲明的變量,不要認(rèn)為某些變量在解析過程中不會被定義。(2)這個文件的語法允許把你的源代碼組織成模塊,一個模塊屬下列類型之一:1)靜態(tài)庫2)共享庫,且只有共享庫將被安裝/

2、復(fù)制到您的應(yīng)用軟件包,雖然靜態(tài)庫能被用于生成共享庫。你可以在每一個Android.mkfile中定義一個或多個模塊,你也可以在幾個模塊中使用同一個源代碼文件。(1)編譯系統(tǒng)為你處理許多細節(jié)問題。例如,你不需要在你的Android.mk中列出頭文件和依賴文件。NDK編譯系統(tǒng)將會為你自動處理這些問題。這也意味著,在升級NDK后,你應(yīng)該得到新的toolchain/platform支持,而且不需要改變你的Android.mk文件。注意,這個語法同公開發(fā)布的Android平臺的開源代碼很接近,然而編譯系統(tǒng)實現(xiàn)他們的方式卻是不同的,這是故意這樣設(shè)計的,可以讓程序開發(fā)人員重用外部庫的源代碼更容易。在描述語法

3、細節(jié)之前,咱們來看一個簡單的"helloworld"的例子,比如,下面的文件:sources/helloworld/helloworld.csources/helloworld/Android.mk'helloworld.c'是一個JNI共享庫,實現(xiàn)返回"helloworld"字符串的原生方法。相應(yīng)的Android.mk文件會象下面這樣:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=helloworldLOCAL_SRC_FILES:=helloworld.cincl

4、ude$(BUILD_SHARED_LIBRARY)好,我們來解釋一下這幾行代碼:LOCAL_PATH:=$(callmy-dir)一個Android.mkfile首先必須定義好LOCAL_PATH變量。它用于在開發(fā)樹中查找源文件。在這個例子中,宏函數(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。這是必要的,因句所有而編譯控制文件而在同一個GNUMAKE執(zhí)行環(huán)境中,所有白森量都是全局的。LOCAL_MODULE:=helloworldLOCAL_MODULE變量必須定義,以標(biāo)識你在Android.mk文件中描述的每個模塊。名稱必須是唯一的,而且不包含任何空格。注意編譯系統(tǒng)會自動產(chǎn)生合適的前綴和后綴,換句話說,一個被命名為foo的共享庫模塊,將會生成libfoo.so'文件。重要注意事項:如果你把庫命名為,libhelloworld?,編譯系統(tǒng)將不會添加任何的lib前綴,也會生成libhelloworld.so,這是為了支持來源于Android平

6、臺的源代碼的Android.mk文件,如果你確實需要這么做的話。LOCAL_SRC_FILES:=helloworld.cLOCAL_SRC_FILES變量必須包含將要編譯打包進模塊中的C或C+源代碼文件。注意,你不用在這里列出頭文件和包含文件,因為編譯系統(tǒng)將會自動為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好?!咀⒁?,默認(rèn)的C+源碼文件的擴展名是?.cpp?.指定一個不同的擴展名也是可能的,只要定義LOCAL_DEFAULT_CPP_EXTENSION變量,不要忘記開始的小圓點(也就是定義為,.cxx?,而不是,cxx?)(當(dāng)然這一步我們一般不會去改它)include$(BU

7、ILD_SHARED_LIBRARY)BUILD_SHARED_LIBRARY是編譯系統(tǒng)提供的變量,指向一個GNUMakefile腳本(應(yīng)該就是在build/core目錄下的shared_library.mk),負(fù)責(zé)收集自從上次調(diào)用'include$(CLEAR_VARS)'以來,定義在LOCAL_XXX變量中的所有信息,并且決定編譯什么,如何正確地去做。并根據(jù)其規(guī)則生成靜態(tài)庫。同理對于靜態(tài)庫。在sources/samples目錄下有更復(fù)雜一點的例子,寫有注釋的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_前綴,一個小例子:MY_SOURCES:=foo.cifneq($(MY_CONFIG_BAR),)endifLOCAL_SRC_FILES+=$(MY_SOURCES)1. GNUMake變量這些GNUMake變量在你的Android.mk文件解析之前,就由編譯系統(tǒng)定義好了。注意在某

9、些情況下,NDK可能分析Android.mk幾次,每一次某些變量的定義會有不同。(1) CLEAR_VARS:指向一個編譯腳本,幾乎所有未定義的LOCAL_XXX變量都在"Module-description"節(jié)中列出。你必須在開始一個新模塊之前包含這個腳本。include$(CLEAR_VARS)(2) BUILD_SHARED_LIBRARY:指向編譯腳本,收集所有的你在LOCAL_XXX變量中提供的信息,并且決定如何把你列出的源代碼文件編譯成一個共享庫。注意,你必須至少在包含這個文件之前定義LOCAL_MODULE和LOCAL_SRC_FILES,使用例子:inclu

10、de$(BUILD_SHARED_LIBRARY)(注意這將生成一個名為lib$(LOCAL_MODULE).so的文件)(3) BUILD_STATIC_LIBRARY:一個BUILD_SHARED_LIBRARY變量用于編譯一個靜態(tài)庫。靜態(tài)庫不會復(fù)制到你的project/packages中,但是能夠用于編譯共享庫,(看下面描述的LOCAL_STATIC_LIBRARIESandLOCAL_STATIC_WHOLE_LIBRARIES)使用例子:include$(BUILD_STATIC_LIBRARY)(注意,這將會生成一個名為lib$(LOCAL_MODULE).a的文件)。(4) TA

11、RGET_ARCH:目標(biāo)CPU平臺的名字,和android開放源碼中指定的那樣。如果是arm,表示要生成ARM兼容的指令,與CPU架構(gòu)的修訂版無關(guān)。(5) TARGET_PLATFORM:Android.mk解析的時候,目標(biāo)Android平臺的名字.詳情可參考/development/ndk/docs/stable-apis.txt.android-3->OfficialAndroid1.5systemimagesandroid-4->OfficialAndroid1.6systemimagesandroid-5->OfficialAndroid2.0systemimages

12、(6) TARGET_ARCH_ABI:暫時只支持兩個value,armeabi和armeabi-v7a。在現(xiàn)在的版本中一般把這兩個值簡單的定義為arm,通過android平臺內(nèi)部對它重定義來獲得更好的匹配。其他的ABI將在以后的NDK版本中介紹,它們會有不同的名字。注意所有基于ARM的ABI者B會把'TARGET_ARCH'定義成,arm?,但是會有不同的,TARGET_ARCH_ABI?(7) TARGET_ABI:目標(biāo)平臺和ABI的組合,它事實上被定義成$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI)在你想要在真實的設(shè)備中針對一個特別的目標(biāo)系統(tǒng)進

13、行測試時,會有用。在默認(rèn)的情況下,它會是android-3-arm'。2.模塊描述變量下面的變量用于向編譯系統(tǒng)描述你的模塊。你應(yīng)該定義在'include$(CLEAR_VARS)'和'include$(BUILD_XXXXX)'之間。正如前面描寫的那樣,$(CLEAR_VARS是一個腳本,清除所有這些變量,除非在描述中顯式注明。(1) LOCAL_PATH:這個變量用于給出當(dāng)前文件的路徑。你必須在Android.mk的開頭定義,可以這樣使用:LOCAL_PATH:=$(callmy-dir)這個變量不會被$(CLEAR_VARS)清除,因此每個Andro

14、id.mk只需要定義一次(即使你在一個文件中定義了幾個模塊的情況下)。(2) LOCAL_MODULE:這是你模塊的名字,它必須是唯一的,而且不能包含空格。你必須在包含任一的$(BUILD_XXXX)腳本之前定義它。模塊的名字決定了生成文件的名字,例如,如果一個一個共享庫模塊的名字是,那么生成文件的名字就是lib.so。但是,在你的NDK生成文件中(或者Android.mk或者Application.mk),你應(yīng)該只涉及(引用)有正常名字的其他模塊。(3) LOCAL_SRC_FILES:這是要編譯的源代碼文件列表。只要列出要傳遞給編譯器的文件,因為編譯系統(tǒng)自動為你計算依賴。注意源代碼文件名稱

15、都是相對于LOCAL_PATH的,你可以使用路徑部分,例如:LOCAL_SRC_FILES:=foo.ctoto/bar.c注意:在生成文件中都要使用UNIX風(fēng)格的斜杠(/).windows風(fēng)格的反斜杠不會被正確的處理。(4) LOCAL_CPP_EXTENSION:這是一個可選變量,用來指定C+代碼文件的擴展名,默認(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:可選的編譯器選項,在編譯C代碼文件的時候使用。這可能是有用的,指定一個附加的包含路徑(相對于NDK的頂層目錄),宏定義,或者編譯選項。重要信息:不要在Android.mk中改變optimization/debugging級別,只要在Application.mk中指定合適的信息,就會自動地為你處理這個問題,在調(diào)試期間,會讓NDK自動生成有用的數(shù)據(jù)文件。(7)LO

17、CAL_CXXFLAGS:SameasLOCAL_CFLAGSforC+sourcefiles(8) LOCAL_CPPFLAGS:與LOCAL_CFLAGS相同,但是對C和C+sourcefiles者B適用。(9) LOCAL_STATIC_LIBRARIES:應(yīng)該鏈接到這個模塊的靜態(tài)庫列表(使用BUILD_STATIC_LIBRARY生成),這僅僅對共享庫模塊才有意義。(10) LOCAL_SHARED_LIBRARIES:這個模塊在運行時要依賴的共享庫模塊列表,在鏈接時需要,在生成文件時嵌入的相應(yīng)的信息。注意:這不會附加列出的模塊到編譯圖,也就是,你仍然需要在Application.mk

18、中把它們添加到程序要求的模塊中。(11) LOCAL_LDLIBS:編譯你的模塊要使用的附加的鏈接器選項。這對于使用“-l'前綴傳遞指定庫的名字是有用的。例如,下面將告訴鏈接器生成的模塊要在加載時刻鏈接到/system/lib/libz.soLOCAL_LDLIBS:=-lz看docs/STABLE-APIS.TXT獲取你使用NDK發(fā)行版能鏈接到的開放的系統(tǒng)庫列表。(13) LOCAL_ALLOW_UNDEFINED_SYMBOLS:默認(rèn)情況下,在試圖編譯一個共享庫時,任何未定義的引用將導(dǎo)致一個朱定義的符號”錯誤。這對于在你的源代碼文件中捕捉錯誤會有很大的幫助。然而,如果你因為某些原因

19、,需要不啟動這項檢查,把這個變量設(shè)為,true?。注意相應(yīng)的共享庫可能在運行時加載失敗。(這個一般盡量不要去設(shè)為true)(14) LOCAL_ARM_MODE:默認(rèn)情況下,arm目標(biāo)二進制會以thumb的形式生成(16位),你可以通過設(shè)置這個變量為arm如果你希望你的module是以32位指令的形式。'arm'(32-bitinstructions)mode.E.g.:(15) LOCAL_ARM_MODE:=arm注意你同樣可以在編譯的時候告訴系統(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所在的目錄路徑,相對于NDK編譯系統(tǒng)的頂層。這是有用的,在Android.mk文件的開頭如此定義:LOCAL_PATH:=$(callmy-dir)(18) all-subdir-makefiles:返回一個位于當(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)那么它就會自動包含sources/foo/lib1/Android.mk和sources/foo/lib2/Android.mk。這項功能用于向編譯系統(tǒng)提供深層次嵌套的代碼目錄層次。注意,在默認(rèn)情況下,NDK將會只搜索在sources/*/Android.mk中的文件。(19) this-makefile:返回當(dāng)前Make巾le的路徑(即這個函數(shù)調(diào)用的地方)(20) parent-makefile:返回調(diào)用樹中父Makefile路徑。即包含當(dāng)前Makefile的M

22、akefile路徑。(21) grand-parent-makefile猜猜看.3.Android.mk使用模板在一個Android.mk中可以生成多個可執(zhí)行程序、動態(tài)庫和靜態(tài)庫。(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)(菜鳥級別

23、解釋:k是賦值的意思,$是引用某變量的值)LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES中加入所需要包含的頭文件路徑,LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態(tài)庫(*.a)的名稱,LOCAL_SHARED_LIBRARIES中力口入所需要鏈接的動態(tài)庫(*.so)的名稱,LOCAL_MODULE表示模塊最終的名稱,BUILD_EXECUTABLE表示以一個可執(zhí)行程序的方式進行編譯。(2)編譯靜態(tài)庫的模板:#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表示編譯一個

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論