Android.mk(TODO)
`Android.mk` 文件是 Android 构建系统(基于 GNU Make)的一个核心部分,用于定义如何构建项目中的模块。在 Android 中,`Android.mk` 文件主要用于描述本地模块(如库、可执行文件等)的构建信息。以下是 `Android.mk` 文件语法的详细介绍。
### 基本结构
一个简单的 `Android.mk` 文件通常包含以下几个部分:
1. **包含主构建脚本**:
通常在文件开头,包含构建系统的顶层文件:
```makefile
include $(CLEAR_VARS)
```
2. **定义模块名称**:
使用 `LOCAL_MODULE` 变量定义模块名称:
```makefile
LOCAL_MODULE := my_module
```
3. **指定模块类型**:
使用适当的编译器变量来指定模块类型(静态库、共享库、可执行文件等):
```makefile
LOCAL_SRC_FILES := main.cpp
LOCAL_STATIC_LIBRARIES := my_static_lib
```
4. **包括构建规则**:
包含适当的构建脚本来处理定义的模块:
```makefile
include $(BUILD_EXECUTABLE)
```
### 主要变量
#### 1. `LOCAL_PATH`
指定当前目录路径,通常用于确保相对路径正确:
```makefile
LOCAL_PATH := $(call my-dir)
```
#### 2. `include $(CLEAR_VARS)`
清除大多数 `LOCAL_` 变量,确保不受前面定义的影响:
```makefile
include $(CLEAR_VARS)
```
#### 3. `LOCAL_MODULE`
指定模块名称:
```makefile
LOCAL_MODULE := my_library
```
#### 4. `LOCAL_SRC_FILES`
指定模块的源文件列表:
```makefile
LOCAL_SRC_FILES := file1.cpp file2.cpp
```
#### 5. `LOCAL_C_INCLUDES`
指定头文件搜索路径:
```makefile
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
```
#### 6. `LOCAL_SHARED_LIBRARIES` 和 `LOCAL_STATIC_LIBRARIES`
指定模块依赖的共享库和静态库:
```makefile
LOCAL_SHARED_LIBRARIES := libshared
LOCAL_STATIC_LIBRARIES := libstatic
```
#### 7. `LOCAL_CFLAGS` 和 `LOCAL_CPPFLAGS`
指定编译器标志:
```makefile
LOCAL_CFLAGS := -Wall
LOCAL_CPPFLAGS := -std=c++11
```
#### 8. `include $(BUILD_SHARED_LIBRARY)`,`include $(BUILD_STATIC_LIBRARY)`,`include $(BUILD_EXECUTABLE)`
指定构建类型(共享库、静态库或可执行文件):
```makefile
include $(BUILD_SHARED_LIBRARY)
include $(BUILD_STATIC_LIBRARY)
include $(BUILD_EXECUTABLE)
```
### 示例
以下是一个示例 `Android.mk` 文件,构建一个共享库:
```makefile
# 设置当前路径
LOCAL_PATH := $(call my-dir)
# 清除变量
include $(CLEAR_VARS)
# 设置模块名称
LOCAL_MODULE := my_shared_lib
# 设置源文件
LOCAL_SRC_FILES := src/main.cpp src/util.cpp
# 设置头文件路径
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
# 设置依赖库
LOCAL_SHARED_LIBRARIES := libdependency
# 编译选项
LOCAL_CPPFLAGS := -std=c++11
# 构建共享库
include $(BUILD_SHARED_LIBRARY)
```
### 高级用法
#### 1. `LOCAL_PREBUILT_LIBS`
用于预编译库的包含:
```makefile
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := prebuilt_lib
LOCAL_SRC_FILES := libs/libprebuilt.so
include $(PREBUILT_SHARED_LIBRARY)
```
#### 2. `LOCAL_STATIC_LIBRARIES` 与 `LOCAL_SHARED_LIBRARIES`
包含其他模块:
```makefile
LOCAL_STATIC_LIBRARIES := libstatic
LOCAL_SHARED_LIBRARIES := libshared
```
#### 3. 包含其他 `Android.mk` 文件
```makefile
include $(LOCAL_PATH)/subdir/Android.mk
```
### 总结
`Android.mk` 文件通过变量定义和包含构建脚本来管理 Android 项目中的模块构建。理解这些语法和变量对于成功构建和管理 Android 项目至关重要。通过定义模块名称、源文件、依赖库和编译选项,可以灵活地构建不同类型的模块(共享库、静态库和可执行文件)。
让我们来创建一个简单的 `Android.mk` 文件的例子,它定义了一个共享库和一个可执行文件。这个例子将展示如何使用 `Android.mk` 文件中的基本语法和变量。
### 示例项目结构
假设我们的项目目录结构如下:
```
my_project/
├── Android.mk
├── src/
│ ├── main.cpp
│ ├── helper.cpp
│ └── library.cpp
└── include/
├── main.h
├── helper.h
└── library.h
```
在这个项目中,我们有一个共享库和一个可执行文件。共享库将包含 `library.cpp`,可执行文件将使用共享库,并包含 `main.cpp` 和 `helper.cpp`。
### 示例 `Android.mk` 文件
```makefile
# 设置当前路径
LOCAL_PATH := $(call my-dir)
# 清除变量
include $(CLEAR_VARS)
# 定义共享库模块
LOCAL_MODULE := my_shared_lib
LOCAL_SRC_FILES := src/library.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_CPPFLAGS := -std=c++11
include $(BUILD_SHARED_LIBRARY)
# 清除变量
include $(CLEAR_VARS)
# 定义可执行文件模块
LOCAL_MODULE := my_executable
LOCAL_SRC_FILES := src/main.cpp src/helper.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES := my_shared_lib
LOCAL_CPPFLAGS := -std=c++11
include $(BUILD_EXECUTABLE)
```
### 解释
1. **设置当前路径**
```makefile
LOCAL_PATH := $(call my-dir)
```
`LOCAL_PATH` 变量设置为当前 `Android.mk` 文件所在的目录。`$(call my-dir)` 是一个内置的 GNU Make 函数,用于返回当前 makefile 文件的路径。
2. **清除变量**
```makefile
include $(CLEAR_VARS)
```
`include $(CLEAR_VARS)` 清除之前定义的所有 `LOCAL_` 变量,确保它们不会对后续的模块定义产生影响。
3. **定义共享库模块**
```makefile
LOCAL_MODULE := my_shared_lib
LOCAL_SRC_FILES := src/library.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_CPPFLAGS := -std=c++11
include $(BUILD_SHARED_LIBRARY)
```
- `LOCAL_MODULE := my_shared_lib`: 定义模块名称为 `my_shared_lib`,这是一个共享库的名称。
- `LOCAL_SRC_FILES := src/library.cpp`: 指定共享库的源文件为 `library.cpp`。
- `LOCAL_C_INCLUDES := $(LOCAL_PATH)/include`: 指定头文件的包含路径。
- `LOCAL_CPPFLAGS := -std=c++11`: 指定编译选项,这里使用 C++11 标准。
- `include $(BUILD_SHARED_LIBRARY)`: 指定构建类型为共享库。
4. **清除变量**
再次清除变量,为下一个模块的定义做准备。
5. **定义可执行文件模块**
```makefile
LOCAL_MODULE := my_executable
LOCAL_SRC_FILES := src/main.cpp src/helper.cpp
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SHARED_LIBRARIES := my_shared_lib
LOCAL_CPPFLAGS := -std=c++11
include $(BUILD_EXECUTABLE)
```
- `LOCAL_MODULE := my_executable`: 定义模块名称为 `my_executable`,这是可执行文件的名称。
- `LOCAL_SRC_FILES := src/main.cpp src/helper.cpp`: 指定可执行文件的源文件为 `main.cpp` 和 `helper.cpp`。
- `LOCAL_C_INCLUDES := $(LOCAL_PATH)/include`: 指定头文件的包含路径。
- `LOCAL_SHARED_LIBRARIES := my_shared_lib`: 指定依赖的共享库为 `my_shared_lib`,即前面定义的共享库。
- `LOCAL_CPPFLAGS := -std=c++11`: 指定编译选项,这里使用 C++11 标准。
- `include $(BUILD_EXECUTABLE)`: 指定构建类型为可执行文件。
### 总结
这个 `Android.mk` 文件示例展示了如何在 Android 构建系统中定义两个模块:一个共享库和一个可执行文件。通过定义 `LOCAL_MODULE`、`LOCAL_SRC_FILES`、`LOCAL_C_INCLUDES`、`LOCAL_SHARED_LIBRARIES` 等变量,我们可以告诉构建系统如何构建这些模块,以及它们之间的依赖关系。`include $(BUILD_SHARED_LIBRARY)` 和 `include $(BUILD_EXECUTABLE)` 分别指定了模块的类型。
相关文章:
Android.mk(TODO)
Android.mk 文件是 Android 构建系统(基于 GNU Make)的一个核心部分,用于定义如何构建项目中的模块。在 Android 中,Android.mk 文件主要用于描述本地模块(如库、可执行文件等)的构建信息。以下是 Android.…...
WPF datagrid 选中某一行后让第一列的checkbox选中
在 WPF 中的 DataGrid 中,如果希望在选中某一行后让该行的第一列中的 CheckBox 选中,可以通过绑定和事件处理来实现。以下是具体的步骤: 绑定数据:确保 DataGrid 的数据源绑定到一个支持 INotifyPropertyChanged 接口的集合。模板…...
洛谷 P1347 排序(福建省历届夏令营)(图论:拓扑排序)
题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列 A,B,C,D表示 A<B,B<C,C<D。在这道题中,我们将给你一系列形如 A<B的关系,并要求你判断是否能够根据这些关系确定这个…...
Redis 缓存击穿、穿透、雪崩
1. 缓存击穿 问题描述: 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又都去数据库去取数据,引起数据库压力瞬间增大…...

使用开源RustDesk部署远程控制服务
使用开源RustDesk部署远程控制服务 文档编写时间:2024/8/1 一、部署环境 操作系统:Ubuntu 2204 LTS IP地址:192.168.108.115 开源软件项目地址:rustdesk/rustdesk-server: RustDesk Server Program (github.com) 参考文档&a…...

Coco-LIC基于ubuntu的vscode进行断点调试
1、下vscode和插件 参考这个也行 https://zhuanlan.zhihu.com/p/704522656 2、编译debug版本并修改json 要在 Visual Studio Code (VSCode) 中进行断点调试 ROS 任务,你需要进行以下几个步骤: ### 1. 安装所需插件 - **C/C 插件**: 提供对 C 代码的调试…...

【Web】从TFCCTF-FUNNY浅析PHPCGI命令行注入漏洞利用
目录 背景 CVE-2012-1823 发散利用 法一:读文件 法二:数据外带 背景 CVE-2012-1823 PHP-CGI远程代码执行漏洞(CVE-2012-1823)分析 | 离别歌 省流: 命令行参数不光可以通过#!/usr/local/bin/php-cgi -d include…...
对比一下在 OpenCV 和 AE 中如何实现常用效果 [精]
确实,Adobe After Effects (AE) 也是一个功能强大的工具,特别擅长处理图像和视频的视觉效果和动画。很多在 OpenCV 中实现的图像处理和增强效果,AE 也可以轻松完成,甚至以更加直观的方式实现。下面对比一下在 OpenCV 和 AE 中如何…...

docker安装及使用
一、docker优点及作用 优点: 基础镜像MB级别创建简单隔离性强启动速度秒级移植与分享放便 作用:资源隔离 cpu、memory资源隔离与限制访问设备隔离与限制网络隔离与限制用户、用户组隔离限制 二、docker安装 2.1.配置yum源 yum install -y yum-uti…...
HTML前端面试基础(一)
HTML面试题可以涵盖多个方面,包括HTML基础、HTML5新特性、标签语义化、元素分类、属性理解等。以下是一些常见的HTML面试题及其简要答案: 1. HTML基础 问题: 请解释一下HTML文档的基本结构。 答案: HTML文档的基本结构包括<…...

[Git][多人协作][下]详细讲解
目录 1.不同分支下多人协作2.远程分⽀删除后,本地git branch -a依然能看到 1.不同分支下多人协作 ⼀般情况下,如果有多需求需要多⼈同时进⾏开发,是不会在⼀个分⽀上进⾏多⼈开发,⽽是⼀个需求或⼀个功能点就要创建⼀个feature分…...

MySQL笔记(七):索引
一、索引优化速度 创建对应字段的索引,只对该列有效,只能提高该列的查询速度 创建索引后,查询速度变快,但是表占用空间变大 create index 索引名 on 表名(需要创建索引的列)二、索引的原理 普通索引允许该字段重复 全文索引&#…...

JS 原型和原型链
构造函数 封装是面向对象思想中比较重要的一部分,js 面向对象可以通过构造函数实现的封装。 同样的将变量和函数组合到了一起并能通过 this 实现数据的共享,所不同的是 JS 借助构造函数创建出来的实例对象之间是彼此不影响的 存在浪费内存的问题&#…...
【无标题】图像增强技术:直方图均衡化、拉普拉斯算子、对数变换与伽马变换
图像增强技术:直方图均衡化、拉普拉斯算子、对数变换与伽马变换 在图像处理领域,图像增强是一种关键技术,用于提升图像的视觉效果和质量。本文将介绍四种常用的图像增强方法:直方图均衡化、拉普拉斯算子、对数变换和伽马变换。我…...
自动化专业英语
前言 电子信息、电气工程、自动化专业英语词汇汇总,不定期更新 常用 Asynchronous:异步synchronous:同步notification:通知blade:平面shaft:轴magnetic:磁场的bearing:轴承valve&…...
如何使用 Python 进行数据可视化,比如绘制折线图?
要使用Python进行数据可视化,可以使用matplotlib库来绘制折线图。以下是一个简单的示例代码: 首先,确保已安装matplotlib库。可以使用以下命令安装: pip install matplotlib在Python脚本中导入matplotlib库: import…...
PostgreSQL数据库的事务ID和事务机制
PostgreSQL后续简称PG。PG只读事务不会分配事务ID。为了在共享锁等情况下对事务进行标识,需要一种非持久化的事务ID,即虚拟事务ID,vxid。虚拟事务ID不需要把事务ID持久化到磁盘。因为事务ID是很宝贵的资源,简单的select语句不会申…...

LeetCode 热题 HOT 100 (020/100)【宇宙最简单版】[创作中]
【链表】No. 0142 环形链表 II【中等】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#…...

XML动态sql查询当前时间之前的信息报错
如图,sql语句在数据库里可以正常运行但是再XML文件不可以正常运行,报错。 原因:在XML中小于号"<"是会被默认认定成文一个标签的开始,所以用小于号就会报错。 解决办法: 1.把表达式反过来改成大于号 2…...

EMQX服务器安装MQTT测试
cd /usr/local/develop wget https://www.emqx.com/en/downloads/broker/5.7.1/emqx-5.7.1-el7-amd64.tar.gz mkdir -p emqx && tar -zxvf emqx-5.7.1-el7-amd64.tar.gz -C emqx ./emqx/bin/emqx start 重启 ./emqx/bin/emqx restart http://10.8.0.1:18083/ 账号ad…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...