Android.mk中的常用文法
Android.mk編譯檔案是用來向Android NDK描述你的C,C++原始碼檔案的, 今天查了一些常用的的文法。
一 概述:一個Android.mk檔案用來向編譯系統描述你的原始碼。
具體來說:該檔案是GNU Makefile的一小部分,會被編譯系統解析一次或更多次的build系統。
你可以在每一個Android.mk檔案中定義一個或多個模組,
你也可以在幾個模組中使用同一個原始碼檔案。
二 文法1 必須定義內容先看必須定義的內容:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := XXXLOCAL_FILES := XXX.cpp...include $(BUILD_XXX)
具體含義如下:
LOCAL_PATH := $(call my-dir)
每個Android.mk檔案必須以定義LOCAL_PATH為開始。它用於在開發tree中尋找源檔案。
my-dir是一個有宏函數,有編譯系統提供,返回當前路徑,即包含Android.mk的檔案目錄。
include $( CLEAR_VARS)
CLEAR_VARS變數由編譯提供,指向一個GNU Makefile,由它負責清理LOCAL_xxx變數(不清理LOCAL_PATH)。
因為所有的編譯控制檔案由同一個GNU Make解析和執行,其變數是全域的,所以清理後才能避免相互影響。
LOCAL_MODULE := XXX
LOCAL_MODULE是模組名,必須在include $(BUILD_XXXXX)之前,定義這個變數,唯一且不包含空格。
LOCAL_SRC_FILES := XXX.cpp
源檔案清單,必須包含將要打包如模組的C/C++ 源碼。
不必列出標頭檔,編譯系統會自動找出依賴標頭檔。
預設的C++源碼的副檔名為.cpp. 也可以修改,通過LOCAL_CPP_EXTENSION。
include $(XXX)
負責收集自從上次調用 include $(CLEAR_VARS) 後的所有LOCAL_XXX資訊。並決定編譯為什麼。
只介紹常用的兩個:
BUILD_STATIC_LIBRARY : 編譯為靜態庫,產生一個名為lib$(LOCAL_MODULE).so的檔案。
BUILD_SHARED_LIBRARY :編譯為動態庫,產生一個名為lib$(LOCAL_MODULE).a的檔案。
2 常用的可選內容LOCAL_MODULE_FILENAME := XXX
一般定義在LOCAL_MODULE := XXX之後,用來覆蓋LOCAL_MODULE,重新定義最終產生的目標檔案名。
LOCAL_CPP_EXTENSION := .cXX
指出C++ 副檔名。例如:LOCAL_CPP_EXTENSION := .cxx .cpp .cc。
LOCAL_C_INCLUDES := XXX
指定包含路徑,編譯時間將會把這些目錄附上。
例如:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
$(LOCAL_PATH)/../../Classes/SdkController \
$(LOCAL_PATH)/../../Classes/SdkController/android \
$(LOCAL_PATH)/../../Classes/ShareController \
$(LOCAL_PATH)/../../../../../cocos2dx/platform/android/jni
LOCAL_CFLAGS := XXX, LOCAL_CPPFLAGS := XXX
用來在編譯C/C++時,附加編譯選項。
例如:
LOCAL_CFLAGS := \
-Wno-multichar \
-DAndroid \
-DLIBDIR="c" \
-DBUILDING_LIBICONV \
-DIN_LIBRARY
LOCAL_WHOLE_STATIC_LIBRARIES := XXX
靜態庫全連結,編譯器會將靜態庫完整連結而不會進行刪減最佳化。
不同於LOCAL_STATIC_LIBRARIES,類似於使用--whole-archive。
例如:
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_lua_static
import-module:
允許尋找並匯入其它modules到本Android.mk中來。它會從NDK_MODULE_PATH尋找指定的模組名。
$(call import-module,)
例如:
$(call import-module,cocos2dx)
$(call import-module,CocosDenshion/android)
$(call import-module,scripting/lua/proj.android)
附錄:參考博文
http://www.cnblogs.com/wainiwann/p/3837936.html
http://www.cnblogs.com/leaven/archive/2011/01/25/1944688.html