前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >make与makefile

make与makefile

作者头像
用户11173787
发布2024-06-24 11:19:21
660
发布2024-06-24 11:19:21
举报
文章被收录于专栏:破晓破晓

相信大家都有过这样的经历:当我们在Linux上运行代码时,是需要在命令行上输入相关指令的,例如:

代码语言:javascript
复制
user@VM-8-5-centos exercise]$ g++ test.cc -o my.out -std=c++

这是不是太麻烦了,太坑爹了??别着急,这时候我们的前辈大佬们就想着:能不能把这些命令都写进一个文件里,每次想要执行代码,执行这个文件即可。就这样,makefile出现了!!

首先:先向大家说明,make是一个命令行中的命令,而makefile则是一个文件名称,make这个命令是用来执行makefile这个文件的

makefile:

1.mekefile编译过程:

Makefile文件中的命令有一定规范,一旦该文件编写好以后在Linux命令行中执行一条make命令即可自动编译整个工程。不同厂家的make可能会稍有不同,并且语法上也有区别,不过基本思想都差不多,主要还是落在目标依赖上,最广泛使用的是GNUmake。

2.语法规则:

代码语言:javascript
复制
目标 ... : 依赖 ...
	命令1
	命令2
	. . .

makefile的使用规则,就好像一个厨师做饭一样,俗话说:巧妇难为无米之炊,再好的厨师,如果没有做饭的食材和工具,照样烧不出好吃的菜肴。这里的目标就是做好菜,依赖的就是做饭所需的食材和工具,命令就是厨师的厨艺。

同时这些依赖也有可能此时并不存在,需要现场制作,或者是由其他厨师做好,那么这个依赖就成为了其他规则的目标,该目标也会有他自己的依赖和命令。这样就形成了一层一层递归依赖组成了Makefile文件。 Makefile并不会关心命令是如何执行的,仅仅只是会去执行所有定义的命令,和我们平时直接输入命令行是一样的效果。 1、目标即要生成的文件。如果目标文件的更新时间晚于依赖文件更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则会进行重新编译并更新目标文件。 2、默认情况下Makefile的第一个目标为终极目标。 3、依赖:即目标文件由哪些文件生成。 4、命令:即通过执行命令由依赖文件生成目标文件。注意每条命令之前必须有一个tab(此文档编辑器默认是空格,复制下来的代码需要把命令代码的缩进改为tab制表符)保持缩进,这是语法要求(会有一些编辑工具默认tab为4个空格,会造成Makefile语法错误)。 5、all:Makefile文件默认只生成第一个目标文件即完成编译,但是我们可以通过all 指定所需要生成的目标文件。例如下面的例子。

代码语言:javascript
复制
all: target1 target2 target3
target1:
# 编译规则1
target2:
# 编译规则2
target3:
# 编译规则3

all被设置为第一个目标,并且target1、target2和target3被列为all的依赖。当你在命令行中运行make时,make命令会寻找并执行all目标规则,这将依次执行target1、target2和target3的编译规则。 因此,通过在Makefile中设置all作为默认目标规则,你可以简化构建过程,只需运行make命令即可执行整个编译过程,无需显式指定目标。

3.伪目标:.PHONY

用 .PHONY 修饰,伪目标的特性是,总是被执行的。

因此,伪目标常用在清理临时文件、测试项目、生成文档、打包发布等。通过定义伪目标,可以方便地执行这些操作,而无需手动输入复杂的命令。其中,我们最常用在清理临时文件。

定义伪目标的主要意义在于:

命名约定:通过定义伪目标,可以对常用的操作或任务进行命名约定,使得其他开发者或使用者能够清晰地理解该目标的用途和作用。

避免与同名文件冲突:有时候,可能会有与目标同名的文件存在。通过定义伪目标,可以避免与同名文件产生冲突。伪目标的存在告诉 Make 工具该目标不是用于生成文件,而是执行相应的操作。

组织和管理构建任务:伪目标可以用来组织和管理构建流程中的各个任务或操作。通过定义伪目标,可以将相关的任务组织在一起,并通过依赖关系和命令定义来控制它们的执行顺序。

提高可读性和可维护性:通过使用伪目标,可以使 Makefile 更具可读性和可维护性。通过给任务命名,并将任务的逻辑和命令定义在一处,可以提高代码的清晰度和可维护性。

代码语言:javascript
复制
.PHONY:clean
clean:
	rm -f my.out

这样一来,make clean操作就可以一直执行。

4.写在后边

有些同学还有些疑问:makefile这个文件放在哪里呀?

假如我们在系统的某一个目录下,创建一份名为hello.cc的文件,那么我们就在同一个目录下创建一个依赖对象为hello.cc的makefile即可,当我们进入目录后,在命令行中输入make,系统就会在这一目录下查找是否存在makefile文件,找到后,依照其中的指令进行运行,然后在这一目录下会新增一个高亮的文件,运行这个文件即可。

如下图:

写到最后:因作者水平有限,难免会遇到错误,如有错误,敬请指正!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • makefile:
    • 1.mekefile编译过程:
      • 2.语法规则:
        • 3.伪目标:.PHONY
          • 4.写在后边
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档