首页 > 其他分享 >Android.mk语法规则(主要针对C编译)

Android.mk语法规则(主要针对C编译)

时间:2024-07-28 19:09:36浏览次数:11  
标签:makefile mk 编译 PATH Android LOCAL

参考页面:https://www.jb51.net/program/29533325i.htm
https://www.cnblogs.com/kn-zheng/p/17005182.html

Android.mk是什么

Android.mk是 Android 工程管理文件,类似于编译文件的说明书,用来向NDK编译系统描述源代码,并将源文件分组为模块(包括静态库、共享库、独立可执行文件)。
Android.mk 会被编译系统解析一次或多次,可以在每一个 Android.mk 文件中定义一个或多个模块,也可以多个模块使用同一个 .mk 文件。
尽量少的在Android.mk中声明变量,不要假定任何变量名不会在解析过程中定义,如若必须声明,变量名前最好加上特殊字符如MY_xxx

一个简单的Android.mk示例

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=test
LOCAL_C_ALL_FILES := $(call all-c-files-under)
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
LOCAL_SRC_FILES := test.c\
                   test1.c\
                   src/test3.c\
TARGET_PLATFORM := E3 # 指定平台
include $(BUILD_EXEUTABLE) # 指定编译产物类型
  • my-dir是系统提供的宏函数,会返回最后一次include调用的makefile所在的路径,通常对应当前anroid.mk文件的目录
  • CLEAR_VARS是另一个宏函数,它的作用是把编译相关的环境变量全部清空(防止之前的编译对当前编译过程产生影响),但不清空LOCAL_PATH
  • 必须要先设置LOCAL_PATH然后在进行其他include操作
  • LOCAL_MODULE指定了编译生成产物的名字,编译系统会自动产生合适的前缀和后缀
  • LOCAL_MODULE_PATH指定了编译生成产物的所在位置
  • LOCAL_SRC_FILES 指定了编译源代码
    可以手动添加,也可以调用$(call all-c-files-under, src)命令调用某个目录下的全部c文件
  • 最后一行指定了编译所生成的目标文件格式,
    BUILD_EXEUTABLE对应了生成可执行Native程序
    BUILD_SHARED_LIBRARY对应了生成动态库(.so文件)
    PREBUILT_SHARED_LIBRARY对应了生成独立的动态库(.so文件)
    BUILD_STATIC_LIBRARY对应了生成静态库(.a文件)
    PREBUILT_STATIC_LIBRARY对应了生成独立的静态库(.so文件)
    BUILD_PACKAGE对应了生成apk文件

拓展情况

1. 编译源码需包含系统库(系统的.so文件)

eg: #include<utils/Log.h>此时对应的Android.mk应添加:

LOCAL_SHARED_LIBRARIES += liblog

那么系统就会从缓存空间中寻找对应的liblog.so

2. 编译源码需包含第三方的库文件(第三方的.so文件)

Android.mk中应添加:

LOCAL_LDFLAGS := -L/Path -lxxx

其中xxx为对应的第三方.so库的名字

3. 编译源码需包含第三方的头文件(第三方的.h文件)

Android.mk中应添加:

LOCAL_C_INCLUDES += $(LOCAL_PATH)/../includes

4. 编译源码需要包含第三方的静态库(第三方的.a文件)

Android.mk中应添加:

LOCAL_LDFLAGS := $(LOCAL_PATH)/XXX.a

Android.mk的基本语法

  1. 变量赋值: XXX := XXX; 变量添加值: XXX += XXX
  2. 读取变量内容: $(变量名字)
  3. 调用函数并返回字符: $(call xxx_func)
  4. include 将其他makefile或编译规则包含到当前的makefile中
  5. 判断语句
ifeq ($(VALUE), xxx)
xxx
else # 此分支可有可无
xxx
endif
  1. 注释符号与python一致,使用#注释

NDK提供的一些常用宏函数

通过类似: $(call function) 的方式来调用,它将返回文本化的信息

  1. my-dir : 返回最后一次include调用的makefile所在的路径
  2. this-makefile,parent-makefile: 返回当前makefile或者父节点makefile所在的路径
  3. all-subdir-makefiles,all-subdir-java-files,all-subdir-c-files:返回当前目录下所有的xxxfile
  4. all-c-files-under,all-java-files-under:返回某个目录下所有的xxxfile、

标签:makefile,mk,编译,PATH,Android,LOCAL
From: https://www.cnblogs.com/yinpengchen/p/18327083

相关文章

  • Qt Android 实现全屏
    本文内容参考自:https://blog.csdn.net/jun4331247/article/details/807396621.新建JFullScreen.java,添加以下代码,放置在QT安装目录\android_armv7\src\android\java\src\org\qtproject\qt5\android\bindingspackageorg.qtproject.junj;importandroid.app.Activity;import......
  • Win11系统下Yolov8的C++编译环境实践
    Date:2024年1月24日概要说明yolo简介及背景    yolo(YouOnlyLookOnce)是目前一种普及性较高的人工智能目标检测方法,它将目标检测任务重新定义为单一的回归问题,从而实现了从图像像素到边界框坐标和类别概率的直接映射。在业界,Yolo的新应用层出不穷,其需求多样变化、源......
  • Termux Android 应用程序中 Twine 安装错误
    我想在TermuxAndroid应用程序中安装tine模块。但我发现了这个错误。截图如下。`如果您确实打算从源代码构建此软件包,请尝试从系统软件包管理器安装Rust编译器,并确保它在安装过程中位于PATH中。或者,建议使用rustup(可在https://rustup.rs......
  • 在Windows使用Java编译工具
    文章目录创建java文件编译Java文件运行Java文件创建java文件桌面右键->新建->文本文档双击打开输入publicclassHello{publicstaticvoidmain(String[]args){ System.out.println("HelloWorld!"); }}将文件名改为hello后缀.java编译Java文......
  • XCode 编译 PAG 源码
    最近工作中要使用PAG替换Lottie,为了方便阅读源码,使用XCode对其源码进行了编译。1下载源码编译源码首先要下载源码,有关PAG源码可直接到github上下载。2添加相关依赖下载源码之后,进入到PAG项目根目录,执行如下脚本:./sync_deps.sh3构建iOSPAGViewer工程PAG项目包含多种......
  • 关于++混合操作,不同编译结果推理
    关于**++**混合操作,不同编译结果推理第一种编译结果:inti=5;intsum=(++i)+(++i)=6+7=13第二种编译结果:inti=5;intsum=(++i)+(++i)=6+7=7+7前面的7是因为后面i的变化被影响后,重新赋值=14第一种编译结果:inti=5;intsum=(++i)+(......
  • GraphHopper路劲规划导航(Android源码调试运行)
    本文主要记录在运行graphhopper安卓版路径规划导航源码的步骤和遇到的问题。成功运行了程序,但是路劲规划一直不成功,问题一开始是服务地址,后来又是key的问题,在这个项目中涉及到了graphhopper、mapbox、mapilion的key,mapbox带导航的key我一直无法获取。目前最大的问题:我无法......
  • 我的新书《Android系统多媒体进阶实战》正式发售了!!!
    我的新书要正式发售了,把链接贴在下面,感兴趣的朋友可以支持下。❶发售平台:当当,京东,抖音北航社平台,小红书,b站❷目前当当和京东已开启预售❸当当网https://u.dangdang.com/KIDHJ❹京东商城https://item.m.jd.com/product/10109083199634.html?gx=RnAoqRAjajbdh8lR5Q&gxd......
  • Windows下用CMake构建和编译第三方依赖库并向C:\Program Files\或C:\Program Files
    从CMake构建和编译第三方依赖库的步骤:1、下载第三方依赖库的源码,并解压到指定的目录中。2、在第三方依赖库的的源码所在的目录下(一般是src/目录下)创建一个文件夹build。3、打开CMakeGUI软件,按照常规步骤配置和产生针对某种编译器的解决方案文件,比如Visualstudio2019。如下如......
  • Android中Service学习记录
    目录一概述二生命周期2.1启动服务startService()2.2绑定服务bindService()2.3先启动后绑定2.4先绑定后启动三使用3.1本地服务(启动式)3.2可通信的服务(绑定式)3.3前台服务3.4IntentService总结参考一概述Service组件一般用来执行长期在后台的任务,如播放音......