【Linux】make和makefile详解

2023-11-12

在linux系统上编译大一点的项目时,会用到make/makefile文件
1.make与makefile
利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。 而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。 而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。 因此,有效的利用make和makefile工具可以大大提高项目开发的效率。

make工具功能

利用make工具可以自动完成编译工作,这些工作包括:

如果修改了某几个源文件,则只重新编译这几个源文件
如果某个头文件被修改了,则重新编译所有包含该头文件的源文件
利用这种自动编译可以大大简化开发工作,避免不必要的重新编译。make工具通过一个称为Makefile的文件来完成并自动维护编译工作,Makefile文件描述了整个工程的编译、连接规则。

makefile工具功能

Makefile描述了整个工程的编译连接规则。makefile表明了目标文件和源文件的依赖关系和依赖方法
举个简单的例子:

 在一个目录下创建一个源文件,创建一个makefile文件,makefile文件中添加目标文件与源文件依赖关系和依赖方法:

    依赖关系:  目标文件:mycode  依赖  源文件:test.c 

    依赖方法:gcc test.c -o mycode

 使用make命令,生成了目标文件mycode   ./mycode 运行可执行程序 就打印出了运行结果。这就是make与makefile的简单使用。这里是项目的生成,下面加入工程的清理:

当我们不需要生成的可执行程序文件时,使用 make clean 命令就可以完成对文件的清理工作

 有细心的小伙伴发现我们在使用make命令编译时什么都不加但是为什么清理时就需要加

make clean 那是因为make在执行makefile文件里的内容时,从上往下执行,第一个依赖关系和依赖方法执行完之后就停止了,第一个make mycode 的mycode可以省略 ,但是第二个起就不能省略了,只能完整的使用 如:make clean 

连续的编译一个文件会提示xxxx is up to date   说明不能连续的编译但是连续的make clean 

却不会报错:

原因是在makefile:中在clean 前加了一个 .PHONY  这个指令代表这一指令总是被执行,所以连续执行clean不会提示。不能连续编译,是编译器的一种只能检查的表现,源文件在没有改变的情况下就没必要进行再编译,我的的小程序没有多大的影响,对于一个大项目来说重新编译会浪费时间也没有必要。

这就又引出了一个问题,编译器是怎么识别这个程序需不需要重新编译?

每一个文件都有文件属性:

每个文件都有三个时间:

1.Access:访问文件的时间

 2.Modify:修改文件内容的时间

3.Change:修改文件属性的时间

每次访问文件不一定修改Access的时间,因为访问文件的次数是很多的,但是这个时间也没必要每一次访问都修改,对于系统来说是一个很大的工程,访问文件的时间也没有那么重要,所以可能多次访问改变一次文件的 Access的时间。文件的大小改变那Modify的时间就会改变,文件的大小是文件的属性所以Change的时间一定会改变。Change的时间会随着用户chmod 手动改变文件的属性而改变。touch  xxx  可以更新xxx文件的三个属性。

源文件的Modify 没有改变,在编译好的情况下,就没有必要进行再编译,所以编译器只用比较

源文件的Modify和目标文件的Modify时间,判断需不需要重新编译。若源文件的Modify 时间新则可以进行再编译,反之,不编译。加了.PHONY系统就不会根据自己的判断去决定指令该不该执行,而是总是执行指令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】make和makefile详解 的相关文章

随机推荐

  • 全/半虚拟化、硬件/软件辅助的全虚拟化之间的区别与联系

    全虚拟化 不需要对GuestOS操作系统软件的源代码做任何的修改 就可以运行在这样的VMM中 在全虚拟化的虚拟平台中 GuestOS并不知道自己是一台虚拟机 它会认为自己就是运行在计算机物理硬件设备上的HostOS 因为全虚拟化的VMM会将
  • react-redux 实现计数器

    1 首先编写action 描述要发生的行为 我们要做的是实现简单的加减 所以定义两种action type字段就是描述这两种行为 最后暴漏这两种action 定义action 主要用于描述将要发生的行为 const counterAddAc
  • React-Native+react-native-camera+react-native-image-picker实现扫码功能、拍照显示及从拍好的照片中读取二维码或条形码

    一 用到技术版本 1 react native 0 59 8 2 Android buildToolsVersion 28 0 3 minSdkVersion 16 compileSdkVersion 28 targetSdkVersion
  • 产品经理入门——必备技能之【产品运营】

    文章目录 一 基础介绍 1 1 用户生命周期 产品生命周期 1 2 运营的目的 1 3 运营的阶段 1 4 运营的主要工作 海盗模型 二 AARRR模型 2 1 Acquisition 拉新 2 2 Activision 促活 2 3 Re
  • 让所有GUI都自动化-PyAutoGUI(GUI自动化工具)

    目录 1 前言 2 简介 3 安装 4 常用函数 5 保护措施 6 鼠标函数 7 键盘函数 8 消息弹窗函数 9 截屏函数 10 示例 1 前言 在使用 Selenium 进行自动化测试时 鼠标事件可以用 ActionChains 类 键盘
  • 深度学习三:分类问题之概率生成模型

    分类问题 概率生成模型 课程例子 通过宝可梦的一些属性能不能预测出这个宝可梦属于哪个类型 用于分类的训练集数据 一直宝可梦的属性和他所属于的种类 如果考虑用线性回归的方式来做这件事情 如果输入数据 通过函数得到的值接近1 我们就说这只宝可梦
  • 自定义类型<结构体>

    目录 1 结构的基础知识 2 结构的声明 3 特殊的声明 4 结构的自引用 5 结构体变量的定义和初始化 6 结构体内存对齐 7 修改默认对齐数 8 结构体传参 1 结构的基础知识 我们之前简单介绍过结构体 可以保存不同数据类型 我们基本数
  • 模拟电路设计(34)---脉宽调制型开关电路

    在开关稳压电源中 直流变换器中的功率晶体管工作在开关状态 目前开关电源的工作频率在几百kHz 有些甚至已经到了MHz量级 如下图所示是DC DC开关变换器的原理框图 DC DC开关变换器的原理框图 开关电源的实现方式有很多种 如最传统的脉宽
  • N32应用笔记1:keil新建工程,编译与烧录

    N32应用笔记1 keil新建工程 编译与烧录 本文目的 前置准备 N32简介 N32G452VEL7简介 我的印象 工程建立流程 1 固件包下载和安装 2 新建工程文件的文件夹 3 keil MDK新建工程 4 向工程分组添加必要的文件
  • windows网络编程-结构体说明

    1 sockaddr in struct sockaddr in short sin family u short sin port 端口 struct in addr sin addr IP地址 long类型 4字节 char sin z
  • 7 SpringBoot整合RocketMQ发送单向消息

    发送单向消息是指producer向 broker 发送消息 执行 API 时直接返回 不等待broker 服务器的结果 这种方式主要用在不特别关心发送结果的场景 举例 日志发送 RocketMQTemplate给我们提供了sendOneWa
  • 通过Hyperic-hq产品的基础包sigar.jar来实现服务器状态数据的获取

    通过Hyperic hq产品的基础包sigar jar来实现服务器状态数据的获取 Sigar jar包是通过本地方法来调用操作系统API来获取系统相关数据 Windows操作系统下Sigar jar依赖sigar amd64 winnt d
  • 安卓培训开发!通宵都要看完这个Android关键技术点,看这一篇就够了!

    前言 上回承诺过大家 一定会出 HTTP 的系列文章 今天终于整理完成了 作为一个 web 开发 HTTP 几乎是天天要打交道的东西 但我发现大部分人对 HTTP 只是浅尝辄止 对更多的细节及原理就了解不深了 在面试的时候感觉非常吃力 这篇
  • C/C++文件操作、输入输出备忘

    1 C 文件操作 1 1 普通ascii字符 1 cin gt gt 结束条件 Enter Space Tab键 读取结束条件 while cin gt gt value cin gt gt 后便可以跟整型 浮点型 字符串 string c
  • TensorFlow中读取图像数据的三种方式

    Update on 2019 06 18 从tesorflow1 11之后 大概是这个版本号 谷歌推出了tf data模块来读取数据 甚至在tensorflow2 0中 取消了数据队列管道 所以我建议大家学习tf data模块 未来我也会做
  • JavaWeb——Servlet详解

    文章目录 什么是Servlet Servlet及其子类 Servlet中常用方法 init service distory Servlet的生命周期 Servlet初始化时机 钝化和活化 Http协议 Session 会话跟踪技术 常用AP
  • Content-encoding: gzip 请求接口响应结果带有乱码解决办法

    问题 在请求接口时 接口响应结果乱码 通过平常的编码格式转化来解码不能解决 观察接口的响应内容编码为Content encoding gzip 解决办法 public static String uncompressString Strin
  • PostgreSQL 系统参数调整及并行设置(转)

    转自 https yq aliyun com teams 5 OS 准备 yum y install coreutils glib2 lrzsz sysstat e4fsprogs xfsprogs ntp readline devel z
  • 如何写好代码?

    想要的都拥有 失去的都释怀 2020鼠于你 文章目录 1 写代码容易吗 2 设计模式 3 软件生命周期 4 技术业务架构 5 轮子 6 开源 7 真相 1 写代码容易吗 代码容易写 也不容易写 但做人不能一直太中立 那我选择好代码不容易写吧
  • 【Linux】make和makefile详解

    在linux系统上编译大一点的项目时 会用到make makefile文件 1 make与makefile 利用make工具 我们可以将大型的开发项目分解成为多个更易于管理的模块 对于一个包括几百个源文件的应用程序 使用make和makef