Android.mk规则初探

一、简介:
1、Android.mk用来向编译系统描述你的源代码文件,这个文件的语法允许你把你的源代码组织成模块,一个模块有以下类型:
1)静态库
2)共享库
3)可执行文件

2、虽然编译系统只会复制/安装共享库到你的软件应用包里面,不过静态库可以用来生成动态库。你可以在每个Android.mk文件里面定义一个或多个模块,也可以在多个模块中使用相同的源文件

3、编译系统可以帮你处理很多细节。比如你不需要在Android.mk中列出头文件和依赖文件,编译系统会自动帮你处理这些问题

二、相关变量介绍
1、LOCAL_PATH:= $(call my-dir)
每个Android.mk文件中必须定义LOCAL_PATH变量,$(call my-dir)调用宏函数my-dir返回包含当前Android.mk的目录路径

2、include $(CLEAR_VARS)
CLEAR_VARS由编译系统提供,指向一个特殊的GNU Makefile,用于清除许多LOCAL_XXX变量,在其内容展开为"build/core/clear_vars.mk",这个在"build/core/config.mk"中有定义

3、LOCAL_SRC_FILES
这个变量用于把你要编译进模块的源代码文件添加进去,当然不用在这里列出头文件和包含文件,编译系统会自动找出依赖型的文件

4、LOCAL_MODULE
指定你要编译生成的模块名,这个名字必须唯一且不包含空格,而且编译系统会自动给这个名字添加前缀"lib"和后缀".so",当然如果你指定的名字前面已经包含lib,那么编译系统就不会重复添加"lib"前缀了

5、include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY由编译系统提供,将Android.mk中指定的模块编译成共享库

6、include $(BUILD_STATIC_LIBRARY)
BUILD_STATIC_LIBRARY由编译系统提供,将Android.mk中指定的模块编译成静态库

7、include $(BUILD_EXECUTABLE)
BUILD_EXECUTABLE由编译系统提供,将Android.mk中指定的模块编译成可执行文件

8、include $(PREBUILT_SHARED_LIBRARY)
PREBUILT_SHARED_LIBRARY由编译系统提供,用于构建预编译的共享库,注意使用这个变量时,LOCAL_SRC_FILES的值应该是一个共享库,而非源代码文件

9、include $(PREBUILT_STATIC_LIBRARY)
PREBUILT_STATIC_LIBRARY由编译系统提供,用于构建预编译的静态库,注意使用这个变量时,LOCAL_SRC_FILES的值应该是一个静态库,而非源代码文件

11、LOCAL_CPP_EXTENSION
指定C++代码文件的扩展名,默认为.cpp

12、LOCAL_C_INCLUDES
路径的可选配置,是从根目录开始的所有源文件

13、LOCAL_CFLAGS
可选的编译器选项,在编译C代码文件的时候使用。这可能是有用的,指定一个附加的包含路径(相对于 NDK 的顶层目录),宏定义,或者编译选项

14、LOCAL_CPPFLAGS
与LOCAL_CFLAGS相同,但是对C和C++源文件都适用

15、LOCAL_CXXFLAGS
与LOCAL_CFLAGS相同,针对C++源文件

16、LOCAL_STATIC_LIBRARIES
应该链接到这个模块的静态库列表(使用BUILD_STATIC_LIBRARY 生成),这仅仅对共享库模块才有意义

17、LOCAL_SHARED_LIBRARIES
这个模块在运行时要依赖的共享库模块列表

18、LOCAL_LDLIBS
编译模块时要使用的附加的链接器选项。这对于使用‘-l’前缀传递指定库的名字是有用的

19、LOCAL_ALLOW_UNDEFINED_SYMBOLS
默认情况下,在试图编译一个共享库时,任何未定义的引用将导致一个“未定义的符号”错误。这对于在源代码文件中捕捉错误会有很大的帮助。然而,如果因为某些原因,需要不启动这项检查,可把这个变量设为‘true’。注意相应的共享库可能在运行时加载失败。(这个一般尽量不要去设为 true)

20、LOCAL_MODULE_PATH
指定生成模块的路径

21、LOCAL_MODULE_FILENAME
重定义输出文件的名字

猜你喜欢

转载自blog.csdn.net/qq_33575901/article/details/88532270