Makefile
会不会写makele,从一个侧面说明了一个是否具备完成大型工程的能力。
一个工程中的源件不计数,其按类型、功能、模块分别放在若干个目录中,makele定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makele就像一个Shell脚本一样,其中也可以执行操作系统的命令。makele带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make是一个命令工具,是一个解释makele中指令的命令工具,makele成为了一种在工程方面的编译方法。
一、关于程序的编译和链接
一般来说,无论是C、C++、还是 pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。
make命令执行时,需要一个 Makele 文件,以告诉make命令需要怎么样的去编译和链接程序。
Makele的书写规则:
1.如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2.如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3.如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
在定义好依赖关系后,后续的那行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头(make并不管命令是怎么工作的,他只管执行所定义的命令。)。
二、 Make是如何工作
1、make会在当前目录下找名字叫“Makele”或“makele”的文件;
2、如果找到,它会查找文件中的第一个目标文件.o;
3、如果文件不存在,它会根据依赖关系查找.s文件;
4、若.s文件不存在,make会在当前文件中查找.s文件的依赖文件.i;
5、若.i文件不存在,会根据依赖关系查找.c文件,当然.c文件是存在的,于是,make会生成一个.o文件,然后去执行文件。
这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即如果在我找了依赖关系之后,冒号后面的文件还是不在,那么make就不工作啦。
三、清空目标文件的规则
每个Makele中都应该写个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁。
一般格式:
.PHONY : clean
clean :
-rm -f 文件
.PHONY意思表示clean是个“伪目标”,而在rm命令前面加了一个小减号的意思就是:也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,就会变成make的默认目标。
例如为创建一个进度条(后边详细讲解)的程序(test.c)编写一个Makefile文件,并在Makefile文件下编辑如下:
格式1:
(注意:如果按格式1写Makefile文件,需要将每行开头处的‘#’删除掉,此为注释符)
格式2:
运行该文件效果如下:
清除Makefile产生的多余文件make clean
注:
1、编写依赖方式时,一定要以Tab键开头(不能用空格代替)
2、clean一般都放在文件的最后
3、@可以屏蔽输出依赖方式
4、makefile 默认值生成一个目标文件,就停止
在linux下编写一个简单的进度条
进度条实现原理:
1)实现动态的增长
定义一个数组,并设置一个计数器,当数字增加的同时,给字符数组每次增加一个元素,并且打印时覆盖之前的数组。
2)保证打印信息输出在一行
每次将光标定位在最左边,从光标处打印,使用‘\n’,回车
3)复制动态的效果实现
定义一个数组
char *index = “-/|\\”;
输出时index[count%4];
4)实现打印长度相同
%-100s
5)给人复制的效果
程序每输出一次,程序挂起一段时间
代码如下:
运行效果如下:
相关推荐
Makefile 文件可以使用缩写和宏来简化命令的书写,例如: $@ 代表该目标的全名 $* 代表已经删除了后缀的目标名 $代表该目标的第一个相关目标名 使用这些缩写可以使 Makefile 文件更加清晰和简洁。 宏的使用 宏...
- **调用方式**:在项目目录中直接运行`make`命令即可根据Makefile文件构建目标;若要清理编译产生的文件,则运行`make clean`。 #### Makefile中变量的使用 在复杂的项目中,频繁地书写相同的路径或选项会导致...
最后,运行`make`命令,Makefile就会根据规则编译所有的源文件,生成`.ko`模块,你可以使用`insmod`或`modprobe`命令将其加载到内核中。 总结来说,编写一个多文件的Linux驱动程序Makefile涉及到设置编译环境变量,...
- **变量MAKEFILE_LIST**:解释MAKEFILE_LIST变量的作用,它用于列出当前make执行所使用的所有Makefile文件。 - **其他特殊变量**:列举并解释一些在Makefile中常用的特殊变量的功能。 - **makefile文件的重建**:...
Makefile 的书写规则是,首先我们需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和链接程序。Makefile 的基本结构包括目标文件、依赖文件、命令三部分。目标文件是 Makefile 的主要内容,它指定了编译...
此外,Makefile中也可以使用shell命令,这些命令会被make工具直接传递给shell去执行。在复杂的Makefile中,经常需要使用到shell命令来完成一些特定的工作,比如文件的移动、复制、创建等。 总的来说,GNUMake是构建...
【描述】:“一篇详细介绍makefile书写的文章,值得一看” 【标签】:“Linux中makefile的书写” 【内容】:Makefile是Unix/Linux环境下用于自动化构建和编译项目的文本文件,它定义了一系列规则,指示操作系统...
Makefile 是 Make 命令的配置文件,告诉 Make 命令如何编译和链接程序。 Makefile 在工程中的作用 Makefile 在工程中的作用是自动化编译过程,提高软件开发的效率。Makefile 定义了一系列的规则来指定哪些文件需要...
在Makefile中,有几组自动变量用于简化命令书写,如`$@`代表当前目标,`$代表第一个依赖项。 五、Makefile的执行流程 1. `make`会检查目标文件的修改时间,如果比依赖文件新,就不执行命令。 2. 如果目标不存在或者...
Makefile是一个文本文件,包含了构建软件项目的规则和指令,使开发者能够通过简单的命令执行编译、链接等复杂任务。以下是对如何编写Makefile的详细说明: 第一部分、概述 Makefile的主要目的是简化和自动化编译...
在Makefile中,可以定义显式规则(explicit rules),显式规则指定了如何将特定的文件从其他文件中创建出来,包括它们依赖的其他文件以及编译它们所需的命令。隐晦规则(implicit rules)则是make预设的规则,它们...
Makefile书写命令部分介绍了如何在makefile中书写命令,包括显示命令、命令执行、命令出错处理以及嵌套执行make。了解这些命令对于编写正确和高效的makefile至关重要。 Makefile的工作方式涉及到了如何根据文件的...
如果工程中的某些文件更新了,make命令会根据依赖关系决定哪些文件需要重新编译。 #### 总结 Makefile是程序构建和维护过程中至关重要的工具。它不仅使得软件的编译过程自动化,还允许开发者自定义编译选项和过程。...
在规则中使用命令 - **命令回显**: - 显示将要执行的命令。 - **执行命令**: - 使用 `$(SHELL)` 调用 shell 来执行命令。 - **并行执行**: - 使用 `-j` 选项来并行执行命令。 - **命令错误**: - Make 会在遇到...
第3章Makefile介绍部分,讲述了Makefile的基本规则和示例、make命令的工作原理以及Makefile中变量的使用。此外,还探讨了make命令的自动推导功能和另类风格的makefile。 第4章Makefile总述中,解释了Makefile文件的...
Makefile是Unix/Linux系统中用于控制软件编译过程的脚本文件,它记录了项目中源文件之间的依赖关系,并规定了如何进行编译和链接,以生成可执行文件。Makefile广泛应用于C和C++的项目中,因为它可以大大简化编译过程...
《Makefile中文手册》是一份详尽的指南,主要针对Linux环境下的运维人员和开发者,旨在帮助他们理解和掌握Make工具的使用。Make是Unix和类Unix系统中的一个自动化构建工具,它通过读取名为Makefile的文件来编译、...
第三章详细解释了Makefile的总述,阐述了Makefile包含的内容、命名规则、如何包含其他makefile文件、特殊变量的使用,以及makefile文件的重建和重载。第四章讨论了Makefile的规则,包括规则的语法、依赖类型、文件名...