首先 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.简单方式:(变量后加 ":=")

linux学习笔记之makefile的更多相关文章

  1. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  2. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  3. Linux学习笔记(一)2015.4.13

    研究生由单片机转Linux学习 首先安装VMware虚拟机,用的是VMware 10.0 在VMware 10.0上安装视频上推荐的Red Hat Linux 5 安装后正式进入Linux学习 笔记1 ...

  4. 20160127 linux 学习笔记

    Linux学习笔记第一天 Linux基本介绍 Linux的起源和发展: 简单说linux是一种操作系统,可以安装在包括服务器.个人电脑,乃至PDA.手机.打印机等各类设备中. 起源: Linux起源于 ...

  5. linux —— 学习笔记(汇总)

    笔记目录:一.系统知识 和 基本概念                    二.常用操作                   三.系统管理(内存.设备.服务等管理)                   ...

  6. Linux学习笔记-林耐斯Notes-Linux就该这么学

    Linux学习笔记... 参考的优秀Linux网站: http://www.w3cschool.cn/linux/ http://www.linuxeye.com/ http://linux.vbir ...

  7. Linux~学习笔记目录索引

    回到占占推荐博客索引 本篇文章是对自己学习Linux及在它的环境下部署工具的一个总结,以方便自己查阅,也给他人一个帮助,本文章同时会不断的更新,欢迎大家订阅! 本目录包括的内容会包括linux基础命令 ...

  8. deepin linux学习笔记(四)进不去图形界面怎么办?

    目录 deepin linux学习笔记(四)进不去图形界面怎么办? 前言 更换成lxde桌面 进不去图形界面怎么办? 总结 deepin linux学习笔记(四)进不去图形界面怎么办? 前言 生命不息 ...

  9. deepin linux 学习笔记(二)——文本编辑器

    目录 deepin linux 学习笔记(二)--文本编辑器 前言 nano 小巧的命令行编辑器 通用 编辑 定位 排版 配置 vim 思路独特的超级编辑器 命令模式 插入模式 底线模式(末行模式) ...

随机推荐

  1. 数据可视化之powerBI技巧(十四)采悟:PowerBI中自制中文单位万和亿

    使用PowerBI的时候,一个很不爽之处就是数据单位的设置,只能用千.百万等英美的习惯来显示,而没有我们中文所习惯的万亿等单位,虽然要求添加"万"的呼声很高,但迟迟未见到改进动作, ...

  2. 数据可视化之powerBI技巧(四)使用Power BI制作帕累托图

    各种复杂现象的背后,其实都是受关键的少数因素和普通的大多数因素所影响,把主要精力放在关键的少数因素上,就能达到事半功倍的效果. 这就是大家常说的二八原则,也称为帕累托原则,最早是由意大利经济学家 V. ...

  3. 数据分析04 /基于pandas的DateFrame进行股票分析、双均线策略制定

    数据分析04 /基于pandas的DateFrame进行股票分析.双均线策略制定 目录 数据分析04 /基于pandas的DateFrame进行股票分析.双均线策略制定 需求1:对茅台股票分析 需求2 ...

  4. 临时解决GitHub的raw.githubusercontent.com无法连接问题

    http://qjzd.net:3000/topic/5e48cc33dcf06d6a181ffb81 查询真实IP 通过IPAddress.com首页,输入raw.githubusercontent ...

  5. POJ 1095 Trees Made to Order 最详细的解题报告

    题目来源:Trees Made to Order 题目大意:根据下面的规则给一棵二叉树编号: 规则1:如果二叉树为空,则编号为0: 规则2:如果二叉树只有一个节点,则编号为1: 规则3:所有含有m个节 ...

  6. Vue你不得不知道的异步更新机制和nextTick原理

    前言 异步更新是 Vue 核心实现之一,在整体流程中充当着 watcher 更新的调度者这一角色.大部分 watcher 更新都会经过它的处理,在适当时机让更新有序的执行.而 nextTick 作为异 ...

  7. C# 接口与抽象类的区别? 情景下使用接口,什么情景下使用抽象类?

    接口与抽象类的区别: 接口支持多继承:抽象类不能实现多继承. 接口可以用于支持回调:抽象类不能实现回调,因为继承不支持. 接口只包含方法.属性.索引器.事件的签名,但不能定义字段和包含实现的方法:抽象 ...

  8. CSS文本溢出,显示省略号(...)

    方式1:这种方式就是必须要跟width搭配使用,当你使用的display:flex; 的时候可能会影响样式 width: 200px; overflow: hidden; /*超出部分隐藏*/ tex ...

  9. 题解 CF1354B 【Ternary String】

    题意 给出一个字符串,只包含 \({1,2}\) 或 \({3}\) .从中找出一个长度最短的子串,要求至少包含 \({1,2,3}\) 各一次,并输出其长度. 输入格式 本题有多组测试数据 第一行一 ...

  10. C++语法小记---函数模板

    函数模板 函数模板的目的是代码复用 普通函数和模板函数可以形成重载,调时优先调用普通函数,其次调用模板函数 模板函数要编译两次,第一次是具现出具体的函数,第二次是对具现出的函数进行编译 函数模板调用特 ...