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

Makefile入门知识总结四浅析makefile的工作机制

四、浅析makefile的工作机制cc:gcctest:main.odemo.ohelloword.occ-otestmain.odemo.ohelloword.omain.o:

四、浅析makefile的工作机制

cc := gcctest : main.o demo.o helloword.occ -o test main.o demo.o helloword.omain.o : main.c common.hcc -o main.c
demo.o : demo.c demo.hcc -o demo.c
helloword.o : helloword.c helloword.hcc -o helloword.cclean:rm test main.o demo.o helloword.o

         上述makefile是一个最为简单的例子,该工程中有3个c文件和3个.h头文件,执行文件test的生成依赖于编译链接的中间目标文件(xxx.o),则上一个例子中的target文件就包括执行文件test和中间目标文件main.o demo.o helloword.o。在命令行中执行命令make,make工具就可以根据makefile中的依赖关系生成执行文件test,执行make clean命令则可以删除执行文件以及中间目标文件。

       所谓依赖关系就是生成该target文件所需要的文件,如上述例子中冒号后面的文件,依赖关系也可以认为是target文件是通过哪些文件来进行更新的。在定义好依赖关系之后,便进行关于如何生成目标文件的操作系统的命令。(PS:进行该命令的编写一定要以 Tab 开头,一般Tab表示的是四个 spaces)

       Make工具不管命令是怎么工作的,这只是一个脚本处理工具,ta只管执行所定义的命令。Make会比较target文件和Prerequisites文件的修改日期,如果Prerequisites文件的日期要比target文件,或者target文件不存在,make就会执行后续定义的命令。

   其次make clean不是一个文件,它可以理解为一个动作,clean的冒号后面没有其他文件,也表明其不存在所谓的依赖关系,所以在执行make时就不会自动去找它的依赖关系,也不会去执行其后的所定义的命令。要执行改命令,就必须在make命令后明显的指出这个label的名字,如make clean。这种方法在make工具中十分有用,我们可以在makefile中定义一些与编译工程无关的命令,比如说程序的打包和备份等。如:

Tar:tar -czf demo.tar.gz *.cbackup:cp demo.c demo.c_backup

       上面我们讲了make的工作机制,那么make是怎么工作的呢?

       在默认的情况下,我们在command line中输入make命令,则:

1)make工具会在当前的文件路径下寻找名为“makefile”or“Mskefile”的文件。

2)如果找到,它就会在该makefile文件中找到第一个target文件,并将该target文件作为最终生成的目标文件。假如没有找到,该工具就会提示“make: *** 没有指明目标并且找不到 makefile。 停止。”。

3)如果target文件不存在,或者是target文件所依赖的.o文件的修改时间比target文件新,那么该工具就会执行后面所定义的命令来生成target文件。

4)如果target文件所依赖的.o文件也不存在的话,make工具就会在当前文件中找target为.o文件的依赖性,如果找到则根据该规则生成.o文件。然后再用生成的.o文件,换言之就是生成最终target文件所依赖的文件执行make命令。

       综上,如果在某个工程中我们修改了其中一个源文件(demo.c),那么根据文件的依赖关系(demo.c的修改时间就比demo.o的要新)其对应的target文件(demo.o)就会被重新编译,如此一来依赖关系(demo.o的修改时间就比test的要新)其对应的target文件(test)就会被重新编译,从而完成project的更新。

       Make的工作方式可以简化为:

1)读入所有的Makefile。2)读入被include的其它Makefile。3)初始化文件中的变量。4)推导隐含规则,并分析所有规则。5)为所有的目标文件创建依赖关系链。6)根据依赖关系,决定哪些目标要重新生成。7)执行生成命令。

 


推荐阅读
  • 个人博客https:juejin.cnuser176366088104638和http:blog.wuzhenyu.com.cncmake编译动态库和链接动态库cmake中&#x ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 本文介绍了C语言中指针的基础知识及其初步应用。首先,文章详细解释了如何定义变量和指针,例如通过 `int i, j, k;` 定义整型变量,以及使用 `int *pi, *pj, *pk;` 来声明指向整型数据的指针。接着,探讨了变量和指针的初始化方法,强调了正确的初始化对于避免程序错误的重要性。此外,还简要介绍了指针在数组、函数参数传递等场景中的基本应用,为初学者提供了全面的入门指导。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 在 Linux 环境下,深入探讨 GTK+3.0 的高级开发技巧,涵盖组件定制、事件处理及多线程应用等核心内容,帮助开发者提升应用界面的交互性和性能。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 深入分析 Linux 内核链表转
    引用地址:http:www.ibm.comdeveloperworkscnlinuxkernell-chainindex.html一、链表数据结构简介链表是一种常用的 ... [详细]
  • ubuntu下基于c++的opencv学习
    一、环境配置1、安装opencv2、makefile编写makefile模板,与c文件在同一个目录下,用make指令生成可执行文件,然后运 ... [详细]
  • 在Ubuntu系统中,由于预装了MySQL,因此无需额外安装。通过命令行登录MySQL时,可使用 `mysql -u root -p` 命令,并按提示输入密码。常见问题包括:1. 错误 1045 (28000):访问被拒绝,这通常是由于用户名或密码错误导致。为确保顺利连接,建议检查MySQL服务是否已启动,并确认用户名和密码的正确性。此外,还可以通过配置文件调整权限设置,以增强安全性。 ... [详细]
author-avatar
我心永恒2602922374_902
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有