首页 > 其他分享 >makefile使用总结(一)

makefile使用总结(一)

时间:2023-04-01 15:55:53浏览次数:49  
标签:总结 文件 edit Makefile make makefile command 使用

本文参考《跟我一起写 Makefile》编写,并做了一些适合个人习惯的修改,稍加总结而成。   首先提出的问题是:什么是makefile?为什么要用makefile?如何使用makefile? 为了回答这三个问题,下面就围绕这些问题做一些记录。

  1. 什么是makefile?
简单点说 makefile 是一个描述了整个工程的编译规则的文件。
  1. 为什么要用makefile?
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,如何靠手动编译,那么无异于为自己找麻烦。此时就可以体现 makefile 带来的好处——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  1. 如何使用makefile?
好处很多,所以需要掌握如何使用它。   一、先了解下Makefile的规则
target ... : prerequisites ...
    command
    ...
看不懂,下面解释一下:
  • target是一个目标文件,可以是object file,也可以是执行文件。
  • prerequisites是要生成的target所需要的文件或是目标。
  • command也就是make需要执行的命令(任意的Shell命令),命令必须由[tab]开头。
target这一个或多个的目标文件依赖于prerequisites中的文件,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。   二、再来一个示例看看Makefile怎么写。
edit : main.o kbd.o command.o display.o \
    insert.o search.o files.o utils.o
    cc -o edit main.o kbd.o command.o display.o \
    insert.o search.o files.o utils.o

main.o : main.c defs.h
    cc -c main.c
kbd.o : kbd.c defs.h command.h
    cc -c kbd.c
command.o : command.c defs.h command.h
    cc -c command.c
display.o : display.c defs.h buffer.h
    cc -c display.c
insert.o : insert.c defs.h buffer.h
    cc -c insert.c
search.o : search.c defs.h buffer.h
    cc -c search.c
files.o : files.c defs.h buffer.h command.h
    cc -c files.c
utils.o : utils.c defs.h
    cc -c utils.c

这个工程包含了3个头文件,和8个C文件。

反斜杠(\)是换行符的意思,这样比较便于Makefile的易读。我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。

在这个makefile中,目标文件(target)包含:执行文件edit和中间目标文件(*.o),依赖文件(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。每一个 .o 文件都有一组依赖文件,而这些 .o 文件又是执行文件 edit 的依赖文件。在定义好依赖关系后,后续的那一行定义了如何生成目标文件的命令。

编写完Makefile文件后,就需要使用make命令执行这个文件。

三、make工作机制

在默认的方式下,只输入make命令即可。然后:
  1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
  2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
  3. 如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
  4. 如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
  5. 当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。
在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。记住,make并不管命令是怎么工作的,他只管执行所定义的命令。 在我们编程中,如果这个工程已被编译过了,当我们修改了其中一个源文件,比如file.c,那么根据我们的依赖性,我们的目标file.o会被重编译,于是file.o的文件也是最新的啦,file.o的文件修改时间要比edit要新,所以edit也会被重新链接了。   Makefile和make的简单使用是没什么问题,碰到需要复杂的工程就需要继续学习Makefile其他知识了,为了文章简洁点,就放在下一个篇幅了。  

标签:总结,文件,edit,Makefile,make,makefile,command,使用
From: https://www.cnblogs.com/citta/p/17278742.html

相关文章

  • docker 常用命令总结
    attach#当前shell下attach连接指定运行镜像build#通过Dockerfile定制镜像commmit#提交当前容器为新的镜像cp#从容器中拷贝指定文件或者目录到宿主机中create#创建一个新的容器,同run,但不启动容器diff......
  • Containerd的使用
    我们知道很早之前的DockerEngine中就有了containerd,只不过现在是将containerd从DockerEngine里分离出来,作为一个独立的开源项目,目标是提供一个更加开放、稳定的容器运行基础设施。分离出来的containerd将具有更多的功能,涵盖整个容器运行时管理的所有需求,提供更强大的......
  • 题目集1~3的总结性Blog
    1、前言:前三次题目集主要涉及到java的编程基础知识和有关类的简单知识。(1)其中涉及了Java中的面向对象编程、控制语句、输入输出流、类和对象等基础知识点。具体包括类的定义、构造函数、成员变量和成员方法、访问权限修饰符、条件语句、循环语句、Scanner类的使用、System.out.p......
  • 关于网络通信中TCP/UDP的端口范围-以及在Linux系统中的使用权限说明
    关于TCP/UDP的端口号的范围都是0~65535 根据IANA定义,可以参考如下链接:https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtmlIANA将这些端口分成了3类,LastUpdated2023-03-30Portnumbersareassignedinvariousways,based......
  • 使用IDEA插件反编译jar包
    使用IDEA插件反编译jar包和class命令行:java-cp+"插件路径"+org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler-dgs=true+jar包+反编译后存储位置示例java-cp"D:\IDEA\IntelliJIDEA2020.1.4\plugins\java-decompiler\lib\java-decompiler.jar......
  • yapi文档使用说明记录
    yapi文档地址:http://192.168.0.97:3000/    在idea下载插件:easy-yapi  配置插件 在 Settings->Other Settings -> EasyAPI 中的 **server **栏中填写服务器地址:http://yapi.gwm.cn/在 Settings->Other Settings -> EasyAPI 的 **tokens **......
  • AI写代码 GitHub Copilot + Idea 安装和使用教程
    GitHubCopilot是微软与OpenAI共同推出的一款AI编程工具,基于GitHub及其他网站的源代码,根据上文提示为程序员自动编写下文代码,可以极大地提高编写代码的效率。根据已有上下文补全代码根据函数名和参数,生成方法体根据注释自动生成代码代码优化生成测试代码一、GitHubCopil......
  • 使用 IntelliJ IDEA 构建 Spring Framework 5.3.21 源码问题解决
    源码版本1、下载地址:https://github.com/spring-projects/spring-framework/tags2、选择要构建的源码版本并下载,例如:5.3.21相关环境1、操作系统:Windows102、JDK版本:Jdk173、IDE工具:IntelliJIDEA2021.3.34、项目构建工具:Gradle7.3.3使用IntelliJIDEA构建Spring......
  • 企业实践 | 如何在阿里云裸金属服务器上使用UEFI模式实践安装国产银河麒麟V10操作系统
    [点击......
  • AFIO-CH32FV2x_V3x--重映射功能的使用以及常见问题
    重映射功能    外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。    简单的讲就是把管脚的外设功能映射到另一个管脚,但不是可以随便映射的。部分重映射&完全重映射部分重映......