[Linux]项目自动化构建工具-make/Makefile

ops/2025/3/1 3:44:51/

项目自动化构建工具-make/Makefile

  • make与Makefile
    • 单文件Makefile
    • 多文件Makefile
  • 缓冲区

首先理清多文件之间的关系:

在这里插入图片描述
这里为什么没有包含test.h头文件?因为在当前工作目录下,因此不需要包含test.h,如果把test.h移到上一级目录,则就不会编译通过了
在这里插入图片描述
再将test.h移动到当前路径下,则就可以编译通过了
在这里插入图片描述
在这里插入图片描述
一般建议先形成目标文件,再将目标文件进行链接形成可执行文件(一般建议这样子进行,因为若进行100个文件进行编译,用上面那种方法,需要编译100个文件,而用现在这种先编译后链接的方法好处是,若有一个文件修改了,则只需要将这一个文件重新进行编译 然后再去链接 而不是重新编译100个文件)

在这里插入图片描述

make与Makefile

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile(或Makefile)是一个文件,两个搭配使用,完成项目自动化构建。

单文件Makefile

首先对于单个test.c文件来说:
makefile中所放的是依赖关系和依赖方法
在这里插入图片描述

Makefile所包含的:依赖关系、依赖方法
在这里插入图片描述
在这里插入图片描述
之后对test.c进行任何修改以后,只需要重新输入make即可自动编译
在这里插入图片描述

在这里插入图片描述
即:
在这里插入图片描述

最后生成完也可以把临时文件清理掉
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

执行完进行清理工作
在这里插入图片描述

多文件Makefile

对于多文件的编译方法:在这里插入图片描述

默认生成同名的.o文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
同理加上清理资源的代码:
在这里插入图片描述

清理完即:
在这里插入图片描述
扩展:
在这里插入图片描述

缓冲区

在这里插入图片描述

ls > Makefile 可以让文件名重定向写入文件中

则此时Makefile默认为:
在这里插入图片描述
修改为:
在这里插入图片描述

想让一条指令执行完接着执行下一条指令中间加;
ls;pwd

在这里插入图片描述

注意此处:
在这里插入图片描述
printf中含有\n的时候,是先打印的hello world 最后再进行的sleep(5)
在这里插入图片描述
但是去掉\n后:
在这里插入图片描述
在这里插入图片描述
是先sleep(5)之后再输出的hello world 这是为什么?
在 Linux 中,printf(“hello world”) 的输出延迟到 sleep(5) 之后显示,是因为 标准输出(stdout)的缓冲机制 导致的。

#include "proc.h"
int main() {printf("hello world");  // 输出内容在缓冲区中,未立即刷新// 注意此时printf是先执行的,但是并不代表是先打印的sleep(5);               // 程序休眠 5 秒,缓冲区未刷新return 0;               // 程序结束,刷新缓冲区,显示内容
}

行缓冲(Line Buffering)
当程序向终端输出时,stdout 默认采用行缓冲模式。此时,只有满足以下条件之一,缓冲区的内容才会被刷新(显示到终端):遇到换行符 \n、缓冲区被填满、程序正常结束(如 main 函数返回)。

全缓冲(Full Buffering)
如果 stdout 被重定向到 文件,则采用全缓冲模式,此时必须手动刷新或缓冲区填满才会输出。

总结:
在这里插入图片描述
\n:回车换行
\r回车:光标回到本行的最开始 不断打印重复内容 覆盖上次内容以实现一个动态内容
fflush:立即刷新出来而非等缓冲区
在这里插入图片描述


http://www.ppmy.cn/ops/162126.html

相关文章

如何实现应用程序与中间件的类进行隔离

以下是一些可以实现类似阿里巴巴 Pandora 功能的框架和工具,这些项目可以帮助你实现类隔离以及中间件和应用的 JAR 包隔离: 1. Pandora Boot Pandora Boot 是阿里巴巴开源的一个基于 Pandora 的轻量级隔离容器,用于管理第三方包&#xff0c…

Redis分布式锁故障处理:当Redis不可用时的应对策略

Redis分布式锁故障处理:当Redis不可用时的应对策略 在分布式系统中,Redis因其高性能和丰富的特性常被用于实现分布式锁。但当加锁过程中Redis服务不可用时,系统将面临严重挑战。本文将深入探讨这一问题,并提供多维度解决方案。 目…

开放标准(RFC 7519):JSON Web Token (JWT)

开放标准:JSON Web Token 前言基本使用整合Shiro登录自定义JWT认证过滤器配置Config自定义凭证匹配规则接口验证权限控制禁用session缓存的使用登录退出单用户登录Token刷新双Token方案单Token方案 前言 JSON Web Token (JWT) 是一种开放标准…

机器学习--(随机森林,线性回归)

一、集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话:三个臭皮匠,赛过诸葛亮。集成算法大致可以分为:Bagging,B…

按键精灵安卓/ios脚本的连点器的坐标点获取教程

在iOS设备上使用按键精灵的连点器脚本功能时,获取坐标点是关键步骤。以下是获取坐标点的几种常用方法: 1. 使用按键精灵自带的坐标获取工具 坐标抓抓功能:按键精灵通常自带抓抓工具,可以通过以下步骤获取坐标: 打开按…

[java基础-JVM篇]2_垃圾收集器与内存分配策略

学习权重30%。 理解问题: 垃圾收集器的特点与 运作原理,JVM自动内存分配与回收的主要规则。 目录 判断对象存活 引用计数法Reference Counting 缺陷 可达性分析(Reachability Analysis)算法 可作为GC Roots的对象 引用的扩展 进行…

TCP基本入门-简单认识一下什么是TCP

部分内容来源:小林Coding TCP的特点 1.面向连接 一定是“一对一”才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的 2.可靠的 无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个…

冒泡排序:简单又易于实现的排序算法

大家好,今天我们来聊聊 冒泡排序(Bubble Sort)算法。听名字是不是很简单,感觉就像是水面上泡泡一样?没错,冒泡排序的名字来源于这种排序过程中,较大的元素像气泡一样逐步“冒泡”到数组的顶端。…