Android .mk文件語法規範及使用模板

模塊描述變量:

下面的變量用於向編譯系統描述你的模塊。你應該定義在'include $(CLEAR_VARS)'和'include $(BUILD_XXXXX)'之間定義。正如前面描寫的那樣,$(CLEAR_VARS是一個腳本,清除所有這些變量,除非在描述中顯式註明。

 

LOCAL_PATH

  這個變量用於給出當前文件的路徑。你必須在Android.mk的開頭定義,可以這樣使用:

 

LOCAL_PATH := $(call my-dir)

這個變量不會被$(CLEAR_VARS)清除,因此每個Android.mk只需要定義一次(即使你在一個文件中定義了幾個模塊的情況下)。

 

LOCAL_MODULE

這是你模塊的名字,它必須是唯一的,而且不能包含空格。你必須在包含任一的$(BUILD_XXXX)腳本之前定義它。模塊的名字決定了生成文件的 名字,例如,如果一個一個共享庫模塊的名字是<foo>,那麼生成文件的名字就是lib<foo>.so。但是,在你的NDK生 成文件中(或者Android.mk或者Application.mk),你應該只涉及(引用)有正常名字的其他模塊。

 

LOCAL_SRC_FILES

這是要編譯的源代碼文件列表。只要列出要傳遞給編譯器的文件,因爲編譯系統自動爲你計算依賴。

注意源代碼文件名稱都是相對於LOCAL_PATH的,你可以使用路徑部分,例如:

LOCAL_SRC_FILES := foo.c \

toto/bar.c

注意:在生成文件中都要使用UNIX風格的斜槓(/).windows風格的反斜槓不會被正確的處理。

 

LOCAL_CPP_EXTENSION

這是一個可選變量,用來指定C++代碼文件的擴展名,默認是'.cpp',但是你可以改變它,比如:

LOCAL_CPP_EXTENSION := .cxx

 

LOCAL_C_INCLUDES

       路徑的可選配置,是從根目錄開始的,

    all sources (C, C++ and Assembly). For example:

        LOCAL_C_INCLUDES := sources/foo

    Or even:

        LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo

       需要在任何包含LOCAL_CFLAGS / LOCAL_CPPFLAGS標誌之前。

 

LOCAL_CFLAGS

可選的編譯器選項,在編譯C代碼文件的時候使用。

這可能是有用的,指定一個附加的包含路徑(相對於NDK的頂層目錄),宏定義,或者編譯選項。

 重要信息:不要在Android.mk中改變optimization/debugging級別,只要在Application.mk中指定合適的信息,就會自動地爲你處理這個問題,在調試期間,會讓NDK自動生成有用的數據文件。

 

LOCAL_CXXFLAGS

Same as LOCAL_CFLAGS for C++ source files

 

LOCAL_CPPFLAGS

與LOCAL_CFLAGS相同,但是對C 和 C++ source files都適用。

 

LOCAL_STATIC_LIBRARIES

應該鏈接到這個模塊的靜態庫列表(使用BUILD_STATIC_LIBRARY生成),這僅僅對共享庫模塊纔有意義。

 

LOCAL_SHARED_LIBRARIES

這個模塊在運行時要依賴的共享庫模塊列表,在鏈接時需要,在生成文件時嵌入的相應的信息。注意:這不會附加列出的模塊到編譯圖,也就是,你仍然需要在Application.mk中把它們添加到程序要求的模塊中。

 

LOCAL_LDLIBS

編譯你的模塊要使用的附加的鏈接器選項。這對於使用”-l”前綴傳遞指定庫的名字是有用的。例如,下面將告訴鏈接器生成的模塊要在加載時刻鏈接到/system/lib/libz.so

LOCAL_LDLIBS := -lz

看docs/STABLE-APIS.TXT獲取你使用NDK發行版能鏈接到的開放的系統庫列表。

 

LOCAL_ALLOW_UNDEFINED_SYMBOLS

  默認情況下,在試圖編譯一個共享庫時,任何未定義的引用將導致一個“未定義的符號”錯誤。這對於在你的源代碼文件中捕捉錯誤會有很大的幫助。

然而,如果你因爲某些原因,需要不啓動這項檢查,把這個變量設爲‘true’。注意相應的共享庫可能在運行時加載失敗。(這個一般儘量不要去設爲true)

 

LOCAL_ARM_MODE

       默認情況下,arm目標二進制會以thumb的形式生成(16位),你可以通過設置這個變量爲arm如果你希望你的module是以32位指令的形式。

    'arm' (32-bit instructions) mode. E.g.:

      LOCAL_ARM_MODE := arm

注意你同樣可以在編譯的時候告訴系統編譯特定的類型,比如

       LOCAL_SRC_FILES := foo.c bar.c.arm

這樣就告訴系統總是將bar.c以arm的模式編譯,

 

 

Android.mk使用模板

在一個Android.mk中可以生成多個可執行程序、動態庫和靜態庫。

1,編譯應用程序的模板:

     #Test Exe

     LOCAL_PATH := $(call my-dir)

     #include $(CLEAR_VARS)

     LOCAL_SRC_FILES:= main.c

     LOCAL_MODULE:= test_exe

     #LOCAL_C_INCLUDES :=

     #LOCAL_STATIC_LIBRARIES :=

     #LOCAL_SHARED_LIBRARIES :=

     include $(BUILD_EXECUTABLE)

(菜鳥級別解釋::=是賦值的意思,$是引用某變量的值)LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES 中加入所需要包含的頭文件路徑,LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態庫(*.a)的名 稱,LOCAL_SHARED_LIBRARIES中加入所需要鏈接的動態庫(*.so)的名稱,LOCAL_MODULE表示模塊最終的名 稱,BUILD_EXECUTABLE表示以一個可執行程序的方式進行編譯。

2,編譯靜態庫的模板:

     #Test Static Lib

     LOCAL_PATH := $(call my-dir)

     include $(CLEAR_VARS)

     LOCAL_SRC_FILES:= \

               helloworld.c

     LOCAL_MODULE:= libtest_static

     #LOCAL_C_INCLUDES :=

     #LOCAL_STATIC_LIBRARIES :=

     #LOCAL_SHARED_LIBRARIES :=

     include $(BUILD_STATIC_LIBRARY)

一般的和上面相似,BUILD_STATIC_LIBRARY表示編譯一個靜態庫。

3,編譯動態庫的模板:

     #Test Shared Lib

     LOCAL_PATH := $(call my-dir)

     include $(CLEAR_VARS)

     LOCAL_SRC_FILES:= \

               helloworld.c

     LOCAL_MODULE:= libtest_shared

     TARGET_PRELINK_MODULES := false

     #LOCAL_C_INCLUDES :=

     #LOCAL_STATIC_LIBRARIES :=

     #LOCAL_SHARED_LIBRARIES :=

      include $(BUILD_SHARED_LIBRARY)

一般的和上面相似,BUILD_SHARED_LIBRARY表示編譯一個共享庫。

 

以上三者的生成結果分別在如下,generic依具體target會變:

out/target/product/generic/obj/EXECUTABLE

out/target/product/generic/obj/STATIC_LIBRARY

out/target/product/generic/obj/SHARED_LIBRARY

      每個模塊的目標文件夾分別爲:

可執行程序:XXX_intermediates

靜態庫:      XXX_static_intermediates

動態庫:      XXX_shared_intermediates

      另外,在Android.mk文件中,還可以指定最後的目標安裝路徑,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH來指定。不同的文件系統路徑用以下的宏進行選擇:

TARGET_ROOT_OUT:表示根文件系統。

TARGET_OUT:表示system文件系統。

TARGET_OUT_DATA:表示data文件系統。

用法如:

LOCAL_MODULE_PATH:=$(TARGET_ROOT_OUT)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章