【Linux】Linux项目自动化构建工具-make/Makefile

1.背景

  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个 文件,两个搭配使用,完成项目自动化构建。

2.概念

makeMakefile 是在类 Unix 系统(包括 Linux 和 macOS)中广泛使用的构建工具和技术。

  • make 是一个命令行工具或者说是一个程序,它的主要作用是根据用户提供的规则去编译和链接程序源代码。当你运行 make 命令时,它会查找一个名为 Makefile 或者 GNUmakefile的特殊文件,并遵循其中的规则来确定应该执行哪些操作。这些规则通常指示了如何基于源代码文件构建可执行文件或其他输出文件,以及在什么条件下(例如某些源文件发生变化时)才需要重新编译。

  • Makefile 是一个文本文件,其中包含一系列构建项目的规则和命令。它定义了源文件、目标文件、依赖关系以及用于构建项目的命令。

3.实例代码

在这里插入图片描述
例如:
在这里插入图片描述
在这里插入图片描述

补充:

  1. .PHONY

上面提过.PHONY:XXX后面的XXX总会被执行
在这里插入图片描述
makefile怎么知道我的程序是否需要被编译?
答:通过对比可执行文件和源文件的最近修改时间,若源文件最近修改时间比可执行文件新,则需要重新被编译,make可以被执行,否则make不能被执行。

  1. makefile/make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。

在这里插入图片描述
会发现上面makefile中首先执行的时code.o被链接,源文件中没有code.o,但最后仍然能被执行,原因就是makefile/make会自动根据文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法。,可将这个过程理解为通过栈实现的过程
在这里插入图片描述
所以即使我们打乱上面的makefile文件中的依赖方法顺序,源文件依然能正常编译执行。
注意:最终要形成的文件一定要放在第一个。

  1. 我们要用的makefile

在这里插入图片描述

bin=mycode               # 定义变量 bin,其值为 mycode,表示最终生成的可执行文件名  
scr=code.c               # 定义变量 scr,其值为 code.c,表示要编译的 C 源文件名  

$(bin):$(scr)           # 定义了一个规则,目标(可执行文件)是 $(bin),依赖是 $(scr)  
   @gcc -o $@ $^        # 使用 gcc 编译器将源代码编译为可执行文件,“$@”代表目标文件名,“$^”代表所有依赖文件
   @echo "compiler $(scr) to $(bin)" # 执行完成后,输出编译信息  
.PHONY:clean            
clean:                   # 定义一个名为 clean 的目标,用于清理构建生成的文件  
   @rm -f $(bin)       # 删除 $(bin) 指定的文件  
   @echo "clean project..." # 执行完成后,输出清理信息

注意:
1.在 Makefile 中,命令前的 @ 符号是可选的,他的作用是阻止 make 工具在执行命令前输出该命令本身。这意味着当make 执行包含 @ 符号的命令时,终端只会显示命令的执行结果,而不会显示命令行命令。
2.要编译 code.c 文件,你可以在命令行中运行 make。要清理生成的文件,你可以运行 make clean
3.#makefile中的注释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值