热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidmakefile(android.mk)分析(1)

1.1makefilehelloworldMakefile的规则如下:target:prerequisitescommandtarge

1.1 makefile helloworld

Makefile的规则如下:

target ... : prerequisites ...

command ... ...

target可以是一个目标文件,也可以是Object File(例如helloworld.obj),也可以是执行文件和标签。

prerequisites就是生成target所需要的文件或是目标。

command也就是要达到target这个目标所需要执行的命令。这里没有说“使用生成target所需要执行的命令”,是因为target可能是标签。需要注意的是command前面必须是TAB键,而不是空格,因此喜欢在编辑器里面将TAB键用空格替换的人需要特别小心了。

我们写程序一般喜欢写helloworld,当我们写了一个c的helloworld之后,我们该如何写helloworld来编译helloworld.c呢?

下面就是编译helloworld的makefile。

helloworld : helloworld.o

    cc -o helloworld helloworld .o

helloworld.o : helloworld.c

    cc -c main.c

clean:

    rm helloworld helloworl.o

之后我们执行make就可以编译helloworld.c了,执行make clean就可以清除编译结果了(其实就是删除helloworld helloworl.o)。

可能有人问为什么执行make就会生成helloworld呢?这得从make的默认处理说起:make将makefile的第一个target作为作为最终的

target,凡是这个规则依赖的规则都将被执行,否则就不会执行。所以在执行make的时候,clean这个规则就没有被执行。

上面的是最简单的makefile,复杂点makefile就开始使用高级点的技巧了,例如使用变量,使用隐式规则,执行负责点shell命令(常见的是字符串处理和文件处理等),这里不打算介绍这些规则,后面在分析android的makefile时会结合具体代码进行具体分析,大家可以先看看陈皓的《跟我一起写makefile》来了解了解。

makefile的大体的结构是程序树形的,如下:

                                                     image

这样写起makefile也简单,我们将要达到的目标作为第一个规则,然后将目标分解成子目标,然后一个个写规则,依次类推,直到最下面的规则很容易实现为止。这其实和算法里面的分治法很像,将一个复杂的问题分而治之。

说到树,我想到了编译原理里面的语法分析,语法分析里面有自顶而下的分析方法和自底而下的分析方法。当然makefile并不是要做语法分析,而是要做与语法分析分析相反的事。(语法分析要做的是一个句子是不是根据语法可以推出来,而makefile要做的是根据规则生成一个command 执行队列。)不过makefile的规则和词法分析还是很像的。下面出一道编译原理上面的一个例子,大家可以理解一下makefile和词法分析的不同点和相同点:

<标识符>  -> <字母><字母数字串>
    <字母数字串>  -> <字母><字母数字串>|<数字><字母数字串>|<下划线><字母数字串>|ε
   <无符号整数> -> <数字><数字串>
   <数字串> -> <数字><数字串>|ε
  <加法运算符>  -> &#43;
   <减法运算符> -> -
  <大于关系运算符> -> >
   <大于等于关系运算符> -> >&#61;

 

最后&#xff0c;介绍一下autoconfautomake&#xff0c;使用这两个工具可以自动生成makefile。

autoconf

从上面的图可以看出&#xff0c;通过autoscan&#xff0c;我们可以根据代码生成一个叫做configure.scan的文件&#xff0c;然后我们编辑这个文件&#xff0c;参数一个configure.in的文件。接着我们写一个makefile.am的文件&#xff0c;然后就可以用automake生成makefile.in&#xff0c;最后&#xff0c;根据makefile.in和configure就可以生成makefile了。在很多开源的工程里面&#xff0c;我们都可以看到makefile.am,configure.in,makefine.in,configure文件&#xff0c;还有可能看到一个十分复杂的makefile文件&#xff0c;许多人学习makefile的时候想通过看这个文件来学习&#xff0c;最终却发现太复杂了。如果我们知道这个文件是自动生成的&#xff0c;就理解这个makefile文件为什么这个复杂了。

欲更加详细的理解automake等工具&#xff0c;可以参考http://www.ibm.com/developerworks/cn/linux/l-makefile/。


推荐阅读
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 求助高手:下载的压缩包中包含CMake文件,如何在Windows环境下使用已安装的CMake GUI进行运行?
    从GitHub仓库 `https://github.com/vonmax007/RobotSimulation` 下载的代码包含多种算法,其中算法1的文件目录中包含了CMake文件。为了在Windows环境下使用已安装的CMake GUI运行这些文件,需要先确保CMake已正确安装,并按照以下步骤操作:打开CMake GUI,设置源代码路径和构建路径,点击“Configure”配置项目,然后点击“Generate”生成构建文件。最后,在生成的构建目录中使用命令行或IDE进行编译和运行。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 深入解析:Android开发进阶之Vim编辑器基础操作与应用
    本文深入探讨了Android开发中使用Vim编辑器的基础操作与应用。通过详细解析Vim的基本命令、配置文件和常用插件,帮助开发者提高代码编写效率。文章还介绍了如何在Android开发环境中高效利用Vim,包括集成开发环境(IDE)的配置和常见问题的解决方法。适合初学者和有经验的开发者参考。 ... [详细]
  • 提升工作效率:掌握这些技巧,IDEA 使用效率翻倍 | IDEA 高效操作指南
    提升工作效率:掌握这些技巧,IDEA 使用效率翻倍 | IDEA 高效操作指南 ... [详细]
  • 西北工业大学作为陕西省三所985和211高校之一,虽然在农业和林业领域不如某些顶尖院校,但在航空航天领域的实力尤为突出。该校的计算机科学专业在科研和教学方面也具有显著优势,是考研的理想选择。 ... [详细]
  • 如何在浏览器中高效调用本地应用程序的方法与技巧
    为了在浏览器中高效调用本地应用程序,本文介绍了一种实用方法。通过创建并运行一个注册表文件(如 `test.reg`),可以实现点击浏览器按钮后自动启动指定的本地应用。具体步骤包括编写特定的注册表条目,并确保其正确配置以支持浏览器与本地应用之间的无缝交互。此外,文章还探讨了安全性和兼容性方面的注意事项,为开发者提供了全面的指导。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • ZeroMQ在云计算环境下的高效消息传递库第四章学习心得
    本章节深入探讨了ZeroMQ在云计算环境中的高效消息传递机制,涵盖客户端请求-响应模式、最近最少使用(LRU)队列、心跳检测、面向服务的队列、基于磁盘的离线队列以及主从备份服务等关键技术。此外,还介绍了无中间件的请求-响应架构,强调了这些技术在提升系统性能和可靠性方面的应用价值。个人理解方面,ZeroMQ通过这些机制有效解决了分布式系统中常见的通信延迟和数据一致性问题。 ... [详细]
  • 系统管理员可以通过多种方法实时监控Linux系统中的用户活动,包括当前已登录的用户及其正在进行的操作。利用特定的命令和工具,管理员可以轻松获取这些信息,确保系统的安全性和稳定性。例如,使用`who`、`w`或`last`等命令可以快速查看当前登录的用户及其活动详情。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 本文探讨了在PowerShell中高效管理和操作大规模内存对象的技术与实践。详细介绍了如何启用PowerShell的大内存支持功能,并提供了优化性能和减少资源消耗的具体方法。此外,还讨论了常见问题及其解决方案,旨在帮助用户在处理复杂数据集时提高效率和稳定性。 ... [详细]
  • 解决 Bash 环境下 MySQL 命令未找到问题的多种方法及专业建议
    在 Bash 环境中,安装 MySQL 后若遇到 `mysql` 命令未找到的问题,通常是因为系统默认搜索路径 `/usr/bin` 中没有包含该命令。为解决此问题,可以采取多种方法,如更新系统 PATH 环境变量、创建符号链接或手动指定 MySQL 安装路径。此外,建议检查 MySQL 服务是否已正确启动,并确保相关配置文件无误,以确保命令执行顺利。 ... [详细]
author-avatar
hexin01
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有