当前位置: 首页 移动开发

android.mk编译规则,1个mk文件编译多个模块

时间:2023年05月31日 阅读:708
以下内容仅是站长或网友个人学习笔记、总结和研究收藏。不保证正确性,因使用而带来的风险与本站无关!
淘客轩-衣食住行外卖生活好助手

最近项目上,程序编译是使用 android.mk 进行管理和编译的,之前一直使用 makfile,最目前这个机制不太了解;

经过这几天了解,现将自己的理解总结如下,有新理解后续再更新。。。。。。


Android.mk 自我理解

1. android.mk 是用来梳理文件的编译关系,即通过最顶层的base_build .mk 文件,经过层层目录的 android.mk 选择(#include ....../Android.mk)到最终的源码目录,最后一直到 模块的源码目录的android.mk;

2. 源码目录的 android.mk 负责包含所有调用到的 相关源文件、头文件、库文件、以及编译规则等,最后生成目标文件的。

3. 如果之前的某个路径,已经通过当前目录下的 Android.mk 文件包含了生成模块A目标文件的Android.mk,而源码目录的上层或者其他目录,也include定义了生成模块A目标文件的Android.mk,那么肯定会出现重复包含的错误。

Android.mk 是什么?

Android.mk 文件用来向编译系统描述需要编译的源代码;该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次的build系统,所以尽量减少声明的变量,不要认为某些变量在解析过程中不会被定义。-这个文件的语法允许把你的源代码组织成模块,一个模块属下列类型之一:静态库、共享库

只有共享库将被安装/复制到您的应用软件包,但静态库能被用于生成共享库。

可以在每一个Android.mk 文件中定义一个或多个模块,也可以在几个模块中使用同一个源代码文件;但通常情况下,每个模块都应该有1个独立的Android.mk 文件用来生成其目标文件。

Android.mk 语法规则

比如:以helloworld的 mk文件为例:

sources/helloworld/helloworld.c

sources/helloworld/Android.mk

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

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)

规则解释:

LOCAL_PATH := $(call my-dir)

【必须定义】一个Android.mk file首先必须定义好LOCAL_PATH变量,用于查找源文件。宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

include $( CLEAR_VARS)

【必须定义】CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,

如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。

Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始以include $(BUILD_XXX)结束。

比如:  include $(BUILD_STATIC_LIBRARY)表示编译成静态库

       include $(BUILD_SHARED_LIBRARY)表示编译成动态库。

       include $(BUILD_EXECUTABLE)表示编译成可执行程序

       LOCAL_MODULE := helloworld

       【必须定义】LOCAL_MODULE变量,以标识你在Android.mk文件中描述的每个模块,名称必须是唯一的,而且不包含任何空格。注意:编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为“foo”的共享库模块,将会生成"libfoo.so"文件。

       所以:如果把库命名为‘libhelloworld’,编译系统将不会添加任何的lib前缀,也会生成libhelloworld.so,这是为了支持来源于Android平台的源代码的Android.mk文件。

       LOCAL_SRC_FILES := helloworld.c

       【必须定义】LOCAL_SRC_FILES变量,包含将要编译打包进模块中的C或C++源代码文件。注意,不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。

       include $(BUILD_SHARED_LIBRARY)

       【必须定义】BUILD_SHARED_LIBRARY是编译系统提供的变量,指向一个GNU Makefile脚本(应该就是在build/core目录下的shared_library.mk),负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。并根据其规则生成静态库;同理对于动态库。

 

打赏
标签: Android

本文地址:https://www.momojc.cn/mobile/android-mk.html

相关推荐
支付宝领大额红包
支付宝领大额红包
似水流年
    今日已经过去小时
    这周已经过去
    本月已经过去
    今年已经过去个月
小姐姐视频

关于本站 | 隐私政策 | 免责声明 | 广告合作 | 我要投稿 | 后台管理

CopyRight © 2023-2024 MOMO教程 WWW.MOMOJC.CN , All Rights Reserved.

站长E-mail:378074730@qq.com 网站已运行:  运行时长:0.028 秒

京ICP备20029690号-1京ICP备20029690号-2 京公网安备11011402013892号京公网安备11011402013892号 中国互联网违法和不良信息举报中心 网络违法犯罪举报网站

本网站托管于 腾讯云 .由网站卫士提供网站加速和攻击防御服务 提供CDN加速/防御服务.由zblogcn强力驱动 又拍云提供CDN加速/云存储服务 51la网站统计