Makefile&make命令

描述:

Makefile(或makefile)文件常为项目创建,规定组件之间的依赖,使编译的时候按照满足组件间依赖关系的顺序(此文件还描述了项目结构、源文件位置、编译参数、输出位置等内容)。

Make命令本身可带有四种参数:标志、宏定义、描述文件名和目标文件名。其标准形式为:Make [flags] [macro definitions] [targets]

make 节省时间的原因:只重新编译修改过的文件。

使用方法:

  • make命令根据Makefile文件生成这个项目的可执行程序。
  • -f file  指定file文件为描述文件,如果file参数为"-"符,那么描述文件指向标准输入。如果没有"-f"参数,则系统将默认当前目录下名为makefile或者名为Makefile的文件为描述文件。在Linux中, GNU make 工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索 makefile文件。

 

  • 当make 命令被调用时,它会查找当前目录下名为makefile或Makefile的文件。它从语法上分析找到的Makefile文件,构建依赖树。之后make检查目标target的依赖,检查这些依赖的target是否存在。如果存在,则判断这些依赖的target是不是最新的(依赖target是否比目标target新,通过检查文件的时间戳),否则重新编译。
  • 当target是一个文件名target时,make比较target文件和其依赖文件的时间戳,如果它的依赖文件是另一个target,那么make就检查该target的依赖的时间戳。这将会是一个沿着依赖树的递归检查。如果make发现了某个比目标target新的文件A,所有在依赖树中受A影响的分支都会被重新编译,从树的底层开始,更新依赖文件。
  • 在执行每个target时,make会打印出当前target的action。这里划重点,每一个action都是在一个分离的子shell中执行的,如果某个action改变了shell的环境,这个改变只会在当前shell生效。举个例子,某个action中调用了cd anotherDir 命令,当前目录就会变为anotherDir,但只会对当前行/action生效,在下一行/action中,当前目录又会变回来。
  • 通过命令行参数中的target ,可指定make要编译的目标,并且允许同时定义编译多个目标,操作时按照从左向右的顺序依次编译target选项中指定的目标文件。如果命令行中没有指定目标,则系统默认target指向描述文件中第一个目标文件。
  • 运行 make clean 时,将执行 rm -f *.o 命令,最终删除所有编译过程中产生的所有中间文件。

拓展:

  • 在make 工具中包含有一些内置的或隐含的规则,这些规则定义了如何从不同的依赖文件建立特定类型的目标。Unix系统通常支持一种基于文件扩展名即文件名后缀的隐含规则。这种后缀规则定义了如何将一个具有特定文件名后缀的文件(例如.c文件),转换成为具有另一种文件名后缀的文件(例如.o文件):
  • 在早期的Unix系统系统中还支持Yacc-C源语法和Lex源语法。在编译过程中,系统会首先在makefile文件中寻找与目标文件相关的.C文件,如果还有与之相依赖的.y和.l文件,则首先将其转换为.c文件后再编译生成相应的.o文件;如果没有与目标相关的.c文件而只有相关的.y文件,则系统将直接编译.y文件。
  • 而GNU make 除了支持后缀规则外还支持另一种类型的隐含规则--模式规则。这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规则。模式规则看起来非常类似于正则规则,但在目标名称的前面多了一个 % 号,同时可用来定义目标和依赖文件之间的关系。
  • 在Linux中大多数软件提供的是源代码,而不是现成的可执行文件,这就要求用户根据自己系统的实际情况和自身的需要来配置、编译源程序后,软件才能使用。只有掌握了make工具,才能让我们真正享受到到Linux这个自由软件世界的带给我们无穷乐趣。

 在Windows下使用make命令

win10 make命令的安装

windows下使用make 

 

 

 Makefile经典教程(掌握这些足够)

Makefile规则③规则语法、依赖、通配符、目录搜寻、目标 

makefile 教程 非常详细,且易懂-

教你写Makefile(很全,含有工作经验的)

linux中makefile设置路径的问题

make完全详解

Linux之make的用法讲解

Linux编译安装中configure、make和make install各自的作用 

 

解决问题

Makefile 的用处与头文件包含顺序引发的问题,解决已包含头文件但还是 undefined reference to

posted @ 2022-03-17 18:43  何以茜茜  阅读(240)  评论(0)    收藏  举报