Android.mk学习记录

一、简介

Android.mk是GNU Makefile的一小部分,用于对android程序的编译。

1.可将一般的Android程序,编译打包成.apk文件。

2.可将Java类库,编译打包成.jar文件。

3.可编译c\c++应用程序。

4.可编译生成c\c++静态库,并打包成.a文件。

5.可编译生成c\c++共享库(动态库),并打包成.so文件,只有共享库才能被安装/复制到APK包中。


二、语法

一个Android.mk文件中可以定义一个或多个模块,不同的模块可以使用同一个源代码文件。

编译系统会处理许多细节问题。如:在Android.mk中不需要列出头文件和依赖文件,系统会自动处理这些问题。

:= 表示等于,是赋值语句,

+= 表示追加,是赋值语句

$ 表示引用变量值


三、语句

1.LOCAL_PATH := $(call my-dir)

指定当前文件路径,宏函数'my-dir'由系统提供,用于返回当前路径。

一个Android.mk必须在开头定义LOCAL_PATH变量。


2.include $(CLEAR_VARS)

清除除了LOCAL_PATH以外的其他LOCAL_XXX变量(如:LOCAL_MODULE、LOCAL_SRC_FILES等等)。

因为所有的模块都是在同一个GNU MAKE环境中,而每个模块中所有变量都是全局的,所以我们需要先清空这些变量,防止在进入一个模块时,变量已经有初始化值了,这是不安全的。因为LOCAL_PATH总是要求在每个模块中都要进行设置,所以并不需要清空它。

CLEAR_VARS由系统提供(android/build/core/config.mk,CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk)。


3.LOCAL_MODULE := helloworld

该变量指定生成的so库名称,必须定义,以描述在Android.mk文件中描述的每个模块。名称必须唯一且不含空格汉字等特殊字符。


4.LOCAL_SRC_FILES := helloworld.c

该变量包含所有要打包进模块的c\c++源代码文件。


5.include $(BUILD_SHARED_LIBRARY)

编译动态库。如果想生成静态库则使用BUILD_STATIC_LIBRARY。


四、系统变量

1.LOCAL_PATH

指定当前路径,LOCAL_PATH := $(call my-dir)


2.LOCAL_MODULE

指定模块名,即编译后的生成的文件名。


3.LOCAL_SRC_FILES

要编译的源代码文件列表。


4.LOCAL_CPP_EXTENSION

可选变量,用来指定c++文件的扩展名,默认是cpp。如:LOCAL_CPP_EXTENSION := .cxx,那么c++扩展名就变成了cxx。


5.LOCAL_C_INCLUDES

可选变量,表示头文件搜索路径。默认搜索路径是LOCAL_PATH。


6.LOCAL_CFLAGS

可选变量,指定编译器,在编译c时可用。


7.LOCAL_CXXCFLAGS

可选变量,指定编译器,在编译c++时可用。


8.LOCAL_CPPCFLAGS

可选变量,指定编译器,编译c\c++时都可用。


9.LOCAL_STATIC_LIBRARIES

可选变量,列出该模块需要用到的静态库。


10.LOCAL_SHARED_LIBRARIES

可选变量,列出该模块在运行时需要的动态库,在连接时就需要用到,以便在生成文件时嵌入其相应的信息。


11.LOCAL_LDLIBS

可选变量,编译模块时要使用的附加的连接器选项。这对于使用'-l'前缀传递指定库的名字是有用的。

如:LOCAL_LDLIBS := -lz表示告诉连接器生成的模块要在加载时刻连接到/system/lib/libz.so


12.LOCAL_ALLOW_UNDEFINED_SYMBOLS

可选变量,试图编译一个共享库时,任何未定义的引用将导致一个“未定义的符号”错误。这对于源代码文件中捕捉错误会有很大的帮助。如果不需要启动这项检查,可以把这个变量设为‘true’。


13.LOCAL_ARM_MODE

可选变量,默认情况下ARM目标二进制会以thumb的形式生成(16位),通过设置这个变量为arm改变成32位指令的形式。

LOCAL_ARM_MODE := arm

LOCAL_SRC_FILES := foo.c bar.c.arm 这样就告诉系统将bar.c以arm的模式编译。


14.LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH

可选变量,指定最后的目标安装路径。

  TARGET_ROOT_OUT表示根文件系统;

  TARGET_OU表示system文件系统;

  TARGET_OUT_DATA表示data文件系统;

  如:LOCAL_MODULE_PATH := $(TRAGET_ROOT_OUT)


五、宏(函数)

GNU Mark 功能宏,使用'$(call xxx)'来调用,将返回文本化的信息。

1.my-dir

返回当前Android.mk所在的目录的路径


2.all-subdir-makefiles

返回一个相当于当前'my-dir'路径的子目录中所有Android.mk的列表。

include $(call all-subdir-makefiles) 这句话将编译'my-dir'中所有的子目录中的Android.mk


3.this-makefile

返回当前Makefile的路径(即这个函数调用的地方)


4.parent-makefile

返回包含当前Makefile的Makefile路径。


5.grand-parent-makefile

包含包含当前Makefile的Makefile的Makefile路径。无法用言语描述了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值