Android.mk 详解

内容预览:
  • Android中增加本地程序或者库,这些程序与其所在路径没有关系,只和它们...~
  • Android.mk与普通的makefile略有不同,Android.mk具有统一的写法,主要...~
  • 1.编译程序: 1.1 可执行程序模板: LOCAL_PATH := $(call my-dir)inclu...~

Android中增加本地程序或者库,这些程序与其所在路径没有关系,只和它们的Android.mk有关系。

Android.mk与普通的makefile略有不同,Android.mk具有统一的写法,主要包含一些系统的公共的宏:

Android.mk中选项参考以下文件路径:

build/core/config.mk

各个选项的默认值在以下文件中定义:

build/core/base_config.mk

在一个android.mk中也可以生成多个可执行程序,动态库,静态库。

1.编译程序:

1.1 可执行程序模板:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
LOCAL_SRC_FILES :=
main.c
LOCAL_MODULE := test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARISE :=
include $(BUILD_STATIC_LIBRAR)


LOCAL_PATH:= $(call my-dir)

此行代码在Android.mk的开头,用于给出当前文件的路径:

LOCAL_PATH:

用于在开发树中查找源文件;

宏函数’my-dir’:

由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)

LOCAL_C_INCLUDES:

表示要加入所需要的包含头文件的路径

LOCAL_MODULE:

表示模块最后最终名称

LOCAL_STATIC_LIBRARIES:

加入所需要的连接的静态库

LOCAL_SHARED_LIBRARISE:

加入所需要的动态库

最后使用include $(BUILD_EXECUTABLE)表示以一个可执行程序的方式进行编译;最终生成的静态库为libtest_static.a;

1.2 编译一个静态库

在Android.mk中编译一个静态库的模板如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
LOCAL_SRC_FILES :=
main.c
LOCAL_MODULE := libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARISE :=
include $(BUILD_STATIC_LIBRARY)

1.3 编译一个动态库

在Android.mk中编译一个动态库的模板如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
LOCAL_SRC_FILES :=
helloworld.c
LOCAL_MODULE := libtest_shared
TARGET_PRELINK_MODULE := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARISE :=
include $(BUILD_SHARED_LIBRARY)

同样,最终生成的动态库的名称是libtest_shared.so;

1.4 编译结果

可执行程序、静态库、动态库生成的编译结果分别为以下目录:

out/target/product/xxxx/obj/EXECUTABLE

out/target/product/xxxx/obj/STATIC_LIBRARY

out/target/product/xxxx/obj/SHARED_LIBRARY

每一个模块的目标文件夹分别为:

  • 可执行文件:_intermediates
  • 静态库: _static_intermediates
  • 动态库:_shared__intermediates

在编译过程中,可以编译目标机的内容,也可以编译主机的内容,可执行文件、动态库、静态库使用宏分别如下所示 :

include $(BUILD_EXECUTABLE)
include $(BUILD_STATIC_LIBRARY)
include $(BUILD_SHARED_LIBRARY)

编译主机的内容,可执行文件、动态库、静态库使用宏分别如下所示 :

include $(BUILD_HOST_EXECUTABLE)
include $(BUILD_HOST_STATIC_LIBRARY)
include $(BUILD_HOST_SHARED_LIBRARY)

在android.mk中,可以指定最后目标安装路径,使用以下两个宏来指定:

LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)  
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)

不同文件系统使用以下宏来进行选择:

2.安装程序:

除了编译各种内容外,有时还需要向目标文件系统复制一些文件,例如配置脚本、资源文件、预置的程序和库等,也有时需要在目标文件系统中创建目录;

在Android.mk,进行目录创建和安装的实例如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
xxx(这里使用正常makefile语法来编写copy动作或者创建动作)

详情看:

一个通用的makefile(一)

一个通用的Makefile(二)

以上就是:Android.mk 详解 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论