共计 2683 个字符,预计需要花费 7 分钟才能阅读完成。
这篇文章主要介绍“Linux 自动化构建工具 make 和 Makefile 如何使用”,在日常操作中,相信很多人在 Linux 自动化构建工具 make 和 Makefile 如何使用问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux 自动化构建工具 make 和 Makefile 如何使用”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
一、make 和 Makefile 的作用
在一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作。
所以,makefile 带来的好处就是 mdash; mdash;“自动化编译”,一旦写好,只需要一个 make 命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的 IDE 都有这个命 令,比如:Delphi 的 make,Visual C++ 的 nmake,Linux 下 GNU 的 make。可见,makefile 都成为了一 种在工程方面的编译方法。make 是一条命令,makefile 是一个文件,两个搭配使用,就可以完成项目自动化构建。
二、make 和 Makefile 的使用
在了解依赖关系和依赖方法之前,我们来写一个 C 语言的小程序。
我们创建了一个 make.c 的文件,并写上了一句 hello make 的代码。
那么我们再创建一个 Makefile 文件 (makefile 也可以,但不建议)。
然后我们编辑 Makefile 文件并写上如下代码:
然后我们保存退出。
然后我们可以执行 make 命令。如果提示 make 不存在,则是因为没有安装,可以切换至 root 身份安装。安装代码:yum install make 或者 sudo install make。
正常执行 make 后会出现如下显示。
然后我们 ll 来查看当前目录下的文件。
我们可以发现多了一个可执行程序 make。那我们运行用 ./make 运行试试。
我们会发现这个可执行程序输出 make。
这就是我们的自动化构建工具,只需要在 Makefile 里面配置一下。往后直接输入 make 即可编译代码。那我们再输入一次 make 试试。
提示我们 make 程序是最新的。也就是说,如果你没有修改或者更新程序的话。那么则不会为你编译,因为你程序都没动呀,编译它干嘛。
那么此时我们回过来分析一下 Makefile 里面写的代码。
首先我们把它分为三部分
make
make.c
gcc make.c -o make -std=c99
这三者的关系就是,make 是依赖于 make.c 产生的。它们两者有依赖关系,而 gcc make.c -o make -std=c99 则是 make 依赖于 make.c 的方法,叫依赖方法。
什么是依赖关系和依赖方法?
打个比方。
月底了,你的生活费用光了。这个时候你给你爸爸打电话,和他说:“爸,月底了。我没钱了。。此时你的爸爸就知道了,会给你打生活费。这里面,你和你的父亲是父子关系,所以你依赖于你的父亲,你们之间有依赖关系。而你的父亲给你生活费,这是你依赖父亲的一种方式,所以这就是依赖方法。如果此时你给你室友的父亲打电话要生活费,他会直接让你滚。因为你们根本不构成依赖关系,不构成依赖关系就没有依赖方法。
所以我的程序也是一样的。make 是生成的可执行程序。而它依赖于 make.c,因为它是从 make.c 编译来的。而依赖方法则是 执行 gcc make.c -o make -std=c99 这条命令。
依赖关系的原理
make 会在当前目录下找名字叫“Makefile”或“makefile”的文件。
如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
如果 hello 文件不存在,或是 hello 所依赖的后面的 test.o 文件的文件修改时间要比 test 这个文件新(可 以用 touch 测试),那么,他就会执行后面所定义的命令来生成 test 这个文件。
如果 test 所依赖的 test.o 文件不存在,那么 make 会在当前文件中找目标为 test.o 文件的依赖性,如果 找到则再根据那一个规则生成 test.o 文件。(这有点像一个堆栈的过程)
当然,你的 C 文件和 H 文件是存在的啦,于是 make 会生成 test.o 文件,然后再用 test.o 文件声明 make 的终极任务,也就是执行文件 test 了。
这就是整个 make 的依赖性,make 会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文 件。
在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么 make 就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make 根本不理。
make 只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
清理
我们平时在写代码的时候,经常会需要反复编译,执行代码。
而在下一次重新编译之前,需要清理一下上次生成的可执行程序。但是清理的时候可能清理错误,不小心把源文件删了,这时又造成了问题。
那么我们有没有方法解决呢?答案是当然有。
我们继续编辑 Makefile 文件。
我们在原有的基础上加上了
.PHONY:clean
clean:
rm -f make
那么.PHONY 有什么作用呢?
.PHONY 修饰的是一个伪目标的,伪目标总是被执行的。clean 是自己定义的一条 make 指令,使用方法为 make clean
那我们来试试吧这条指令
我们可以看到它被清理了,那为什么说伪目标它总是被执行的呢?我们多次执行它看看。
我们可以一直执行它,那么我们多次执行 make 呢?
我们会发现,make 执行了一次,就无法执行了,因为没有被.PHONY 修饰。那么我用.PHONY 修饰它再试试。
然后我们保存退出,多次执行 make
我们就可以看到它被多次执行了。但我觉得没有这个必要,因为文件没有被修改的话。重新编译没有意义,所以自动化编译不建议加上.PHONY
我们保存退出,多次执行 make
我们就可以看到它被多次执行了。但我觉得没有这个必要,因为文件没有被修改的话。重新编译没有意义,所以自动化编译不建议加上.PHONY
到此,关于“Linux 自动化构建工具 make 和 Makefile 如何使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!