C++[转]Android.mk的用法及基本功

本文转自:http://www.cnblogs.com/lilactutu/archive/2010/12/06/1897696.html

一个Android.mk file用来向编译系统描述您的源代码。具体来说:该公文是GNU
Makefile的相同有点一些,会给编译系统解析一次等还是累。你可在列一个Android.mk
file中定义一个还是多只模块,你为堪当几乎独模块中采取以及一个源代码文件。编译系统为你处理过剩细节问题。例如,你无需以您的Android.mk中
列出头文件及依赖文件。NDK编译系统将会晤否汝活动处理这些题目。这为意味着,在晋级NDK后,你应该得到新的toolchain/platform支
持,而且未待改您的Android.mk文件。

 

先期看一个简的事例:一个简的”hello world”,比如下面的公文:

sources/helloworld/helloworld.c 

sources/helloworld/Android.mk

对应的Android.mk文件会象下面这样:

———- cut here ——————

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE

:= helloworld

LOCAL_SRC_FILES := helloworld.c

include $(BUILD_SHARED_LIBRARY)

———- cut here ——————

俺们来解释一下这几执行代码:

LOCAL_PATH := $(call my-dir) 

一个Android.mk
file首先要定义好LOCAL_PATH变量。它用来在开发养中查找源文件。在斯事例中,宏函数’my-dir’,
由编译系统提供,用于返回时路(即蕴涵Android.mk file文件之目)。

include $( CLEAR_VARS)

CLEAR_VARS 由编译系统提供,指定为GNU
MAKEFILE为公拨冗许多LOCAL_XXX变量(例如 LOCAL_MODULE,
LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等…),除LOCAL_PATH
。这是必需之,因为具备的编译控制文件都以跟一个GNU
MAKE执行环境面临,所有的变量都是大局的。

LOCAL_MODULE := helloworld

LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中讲述的每个模块。名称必须是唯一的,而且未保证
含任何空格。注意编译系统会自行出合适的前缀和后缀,换句话说,一个吃取名为’foo’的共享库模块,将会生成’libfoo.so’文件。

LOCAL_SRC_FILES := helloworld.c 

LOCAL_SRC_FILES变量必须含有将要编译打包进模块中之C或C++源代码文件。注意,你绝不于即时
里排出头文件和带有文件,因为编译系统将见面自动为汝追寻来依赖型的文本;仅仅列出直接传送让编译器的源代码文件就好。

 

在Android中增加当地程序要仓库,这些程序和货栈与那所充斥路径没有任何关系,只跟她的Android.mk文件有提到。Android.mk和普通
的Makefile有所不同,它具备合并之写法,主要涵盖部分系统共用的庞。

 

当一个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文件系统。

用法如:

CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)