首先 make时工程管理器

而makefile则是make唯一的配置文件,当我们需要使用make管理工程时,我们需要建立一个makefile文件

简单点说,makefile是把我们所要编译的c文件结合在一起,

就好比当我们写完一个hello.c文件后,我们需要生成可执行文件时,我们需要写入gcc hello.c -o hello,他就会生成可执行文件hello

而makefile就是把这些命令集合在这个文件里面,当工程项目打的时候,可节省时间。

关于makefile,里面有命令及规则,讲讲我学到的

makefile就是由“规则”构成

所谓规则如下:

目标体:依赖文件列表

<TAB>命令(shell命令或编译的命令)

(注:上面的TAB是TAB键,我们需要按下一个TAB键格式才正确,如果是按下空格格式会报错,如果你按下TAB键还是报错,可能是你当初的配置文件.vimrc有错,更改一下试试)

关于上面所讲的规则,举个例子

先建立hello.c文件

建立makefile文件

进去makefile里面,按照刚才上面所说的规则,写入

hello表示目标体,也就是我们要生成的可执行文件,我们想要用hello.c去生成它,说明hello.c是hello的依赖文件,得写在hello后面,中间用冒号隔开

然后下一行是我们想要执行的命令,记住前面加TAB键

我们退出后输入make执行一下makefile文件

这就可以在文件下生成hello可执行文件

如果我们想再make一下呢,会怎么样

咦,结果会报错,这是为什么呢,我们通过ls -l看一下文件的详细信息

发现helloc.跟新的时间比hello要早,而makefile执行一次后就编译修改过的文件,因为我们的hello没有改过,所以报错,错误的意思大概是说hello是

最新的,也就是没被改过,所以它会觉得不用对其进行编译。

如果我们把hello.c修改一下再make一下,就会更新我们的可执行文件

如果我们同时有多个依赖文件也就是想生成可执行文件呢,也是一样,加在目标体后面,命令也得改

make一下,也是一样生成hello可执行文件

如果我们是通过 .o文件来生成可执行文件,我们应该把我们的 .c文件先转变为.o文件,则 .o文件作为可执行文件hello的依赖文件 .c文件作为.o文件的依赖文件,也是得遵循一开始所说的规则来写,如下

接着我们退出make一下,程序正常执行

从上面可看出先执行hello.c->hello.o然后执行hello1.c->hello1.o,最后再执行hello.o hello1.o->hellio

之所以出现这种情况,是因为makefile它会去读取第一个规则,也就是hello:hello.c hello1.c,然后发现目录下没有hello.o和hello1.o,于是去下面规则中找,

发现了 .c 文件依赖于 .o 文件,则执行hello.c->hello.o、hello1.c->hello1.o  ,等这两个.o文件生成了,就可以生成可执行文件了。

正常来说,我们一般删除文件都是用 rm 命令,这时我们有makefile文件我们也可通过其实现文件的删除

clean是一个伪目标,在下面定义一组命令,这些命令的功能就是删除make创建的文件

需要删除这些文件时在目录输入make clean 就行了

当我们如果文件中有一个叫clean的文件夹时,此时我们的make clean还能用吗?

很显然用不了

这时候,我们可以用一个 ".PHONY"特殊目标将“clean”目标声明为伪目标,防止磁盘有名为‘clean"的文件,使clean无法执行

这样就能使用make clean了

这里既然提到了伪目标,就顺便讲一下

伪目标之所以称之为伪目标,是因为作为目标的时候不是一个真正的文件名,也不生成文件,只是用其作为目标来执行下面的命令

以下是规则流程

--------------------------------------------------------------------------以上是建立一个makefile和如何使用make clean的教程----------------------------------------------------------------------

关于makefile里的变量

”所有的变量都是字符串“,因此makefile不用像我们c语言中一样定义数据类型,

变量的定义有两种方式:

1.递归方式:(变量后加"=")

2.简单方式:(变量后加 ":=")

最新文章

  1. 供应链需求调研CheckList
  2. HTML5 Audio/Video 标签,属性,方法,事件汇总
  3. centos7防火墙那些事
  4. chrome开发配置(四)生成项目及配置库引用
  5. 两个textarea 同时变化高度
  6. PHP学习笔记2-流程控制
  7. c语言string.h和memory.h某些函数重复问题
  8. IIS错误解决办法(HTTP Error 500.19 - Internal Server Error)
  9. CentOS 6.4 x64 安装 配置 Redmine 2.4.1
  10. 数据结构(java版)学习笔记(序章)
  11. BZOJ1295 [SCOI2009]最长距离 最短路 SPFA
  12. 关于thymeleaf的if多条件判断
  13. [ES]elasticsearch章3 ES写入过程解析
  14. VC播放mp3的方法
  15. VC设置代理方法
  16. Android上基于libgdx的游戏开发资料
  17. BZOJ2662: [BeiJing wc2012]冻结 spfa+分层图
  18. Python:笔记(7)——yield关键字
  19. Web开发需要常见的问题
  20. Struts访问servletAPI方式

热门文章

  1. Python-02 可视化之tkinter介绍
  2. 数据可视化之DAX篇(二十一)连接表的几个DAX函数,一次全掌握
  3. Ethical Hacking - GAINING ACCESS(24)
  4. 软件测试面试题,十年HR面试经验分享
  5. 题解 CF920F 【SUM and REPLACE】
  6. python thrift 实现 单端口多服务的过程
  7. 组件缓存注意事项 ---keep-alive
  8. Java NIO的理解和应用
  9. django 学习记录(一)
  10. GridMask:一种数据增强方法