【Linux基础】Linux自动化构建工具make/makefile
背景
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
理解
创建一个test.c文件并写入内容。

创建一个makefile文件并写入一些如下内容

我们可以尝试使用make命令了!

make后如果不跟内容的话默认是从第一句指令开始执行到.PHONY结束

我们也可以执行指令进行清除

实例代码
c代码
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
return 0;
}
makefile文件
test.exe:test.o
gcc test.o -o test.exe
test.o:test.s
gcc -c test.s -o test.o
test.s:test.i
gcc -S test.i -o test.s
test.i:test.c
gcc -E test.c -o test.i
.PHONY:clean
clean:
rm -f test.i test.o test.s test.exe
依赖关系
上面的文件 test.exe,它依赖 test.o
test.o, 它依赖 test.s
test.s , 它依赖 test.i
test.i , 它依赖 test.c
依赖方法
gcc test.* -option test.* ,就是与之对应的依赖关系
原理
make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test.exe”这个文件,并把这个文件作为最终的目标文件。
3. 如果test.exe文件不存在,或是test.exe所依赖的后面的test.o文件的文件修改时间要比test.exe这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成test.exe这个文件。
4. 如果test.exe所依赖的test.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成test.o文件。(这有点像一个堆栈的过程)
5. 当然,你的C文件和H文件是存在的啦,于是make会生成 test.o 文件,然后再用 test.o 文件声明make的终极任务,也就是执行文件test.exe了。
6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,
而对于所定义的命令的错误,或是编译不成功,make根本不理。
8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦
项目清理
- 工程是需要被清理的
- 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。
- 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。
- 可以将我们的 test.exe目标文件声明成伪目标,测试一下
该工具的实例应用 -- 进度条
补充知识,\r && \n
回车概念
我们知道我们的外设键盘上总有一个Enter,尤其是老式键盘,总会是

先向下再向左,其实就是先进行换行然后再从这一行的起始位置开始。即先\r (来到这一行的起始位置)后\n(换行)
换行概念
\n:进行换行操作。
补充知识, 行缓冲区
我们在c语言应该了解过一些缓冲区的概念,我们在写入内容的时候通常是先读到缓冲区,然后在从缓冲区加载到屏幕,但这个加载是缓慢的,如果我们使用\n可能就瞬间显示我们要打印的\n之前的内容。
进度条代码
int main()
{
int i = 0;
char bar[102];
memset(bar, 0 ,sizeof(bar));
const char *lable="|/-\\";
while(i <= 100 ){
printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
fflush(stdout);
bar[i++] = '#';
usleep(10000);
}
printf("\n");
return 0;
}
相关文章:
【Linux基础】Linux自动化构建工具make/makefile
背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后…...
问题慢慢解决-通过android emulator调试android kernel-内核条件断点遇到的问题和临时解决方案
起因 在摸索到这个方案之后,mac m1调试aarch64 android kernel最终方案,就准备调试内核了,预备下断点的地方是 b binder_poll b ep_ptable_queue_proc b remove_wait_queue但是由于是android系统,上面三个函数会被频繁的触发&am…...
社区发现之标签传播算法(LPA)
在Graph领域,社区发现(Community detection)是一个非常热门且广泛的话题,后面会写一个系列,该问题实际上是从子图分割的问题演变而来,在真实的社交网络中,有些用户之间连接非常紧密,有些用户之间的连接较为稀疏,连接紧密的用户群体可以看做一个社区,在风控问题中,可…...
【前端素材】推荐优质后台管理系统Dashy平台模板(附源码)
一、需求分析 后台管理系统(或称作管理后台、管理系统、后台管理平台)是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成,为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…...
MFC 配置Halcon
1.新建一个MFC 工程,Halcon 为64位,所以先将工程改为x64 > VC 目录设置包含目录和库目录 包含目录 库目录 c/c ->常规 链接器 ->常规 > 链接器输入 在窗口中添加头文件 #include "HalconCpp.h" #include "Halcon.h"…...
xss-跨站脚本攻击漏洞
前备知识: Cookie和Session是Web开发中用于维持用户状态、跟踪用户会话的核心技术,它们的主要目的是在无状态的HTTP协议基础上实现有状态的用户交互。 **Cookie**: - Cookie是一种由服务器发送到客户端(通常是用户的浏览器&#x…...
在MFC对话框中嵌入web网页时事件失效问题
2010-04-20 日志 在MFC对话框中嵌入web网页时,网页初始化中添加事件无效 document.body.onkeydown function () {//onkeydown"keydownbody()" 不能激发alert(event.keyCode);if(event.keyCode 27)//VK_ESCAPE //String.fromcharcode(A);{if (external…...
【Leetcode】235. 二叉搜索树的最近公共祖先
文章目录 题目思路代码结果 题目 题目链接 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度…...
python 基础语法及保留字
编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适合语…...
Parade Series - NVR Stat
获取文件夹占用空间信息 DIR %NVRHOME% /W /SDIR %NVRHOME% /s | tail -n2 | sed s/,//g | awk {if(NR1){key"Used";}else{key"Free";};sum$3/(1024*1024);unit"MB";if(sum^>1024){sumsum/1024;unit"GB";}printf("{\"Ty…...
【shell脚本实战学习笔记】#2
场景描述 你负责一个Web应用的运维工作,该应用部署在一组Linux服务器上。你需要编写一个Shell脚本来自动化以下任务: 检查Web服务器进程: 确保Web服务器(例如Apache或Nginx)正常运行。如果没有运行,则尝试…...
docker 安装nacos 一脚shell脚本
要创建一个用于安装Nacos的Docker的Shell脚本,你可以按照以下步骤进行。这个脚本会执行以下操作: 拉取Nacos的Docker镜像。创建一个Docker容器并映射必要的端口。设置Nacos的环境变量。如果需要,可以持久化存储数据到本地目录。 以下是一个…...
mysql的隔离级别,和实现
参考链接 https://xiaolincoding.com/mysql/transaction/mvcc.html#%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B 事务特性(ACID) 原子性(Atomicity): 事务是原子的&…...
Linux的信号
Linux的信号是一种用于进程之间通信的机制。它们用于向进程发送通知,告知进程发生了某种事件或请求进程执行某个操作。信号可以由内核、其他进程或进程自身发送。 信号的作用有以下几个方面: 通知进程某个事件的发生,如进程的终止、挂起、恢…...
Spring数据脱敏实现
在当今的数字化时代,数据安全和个人隐私保护变得日益重要。为了遵守各种数据保护法规,如欧盟的GDPR(通用数据保护条例),企业在处理敏感信息时需要格外小心。数据脱敏是一种常见的技术手段,用于隐藏敏感数据…...
Java核心-核心类与API(4)
话接上回,继续核心类与API的学习,最后介绍一下Object类以及与数学、日期/时间有关的类,就结束该部分的学习了,其他的根据需要自行了解。 一、Object类 1、概述 Object 是 Java 类库中的一个特殊类,也是所有类的父类…...
【C语言】详解计算机二级c语言程序题
文章目录 前言资料相关程序题 一(字符串)程序题 二(数组)程序题 三(基础)程序题 四(结构体)程序题 五(结构体)程序题 六(基础) 前言 …...
限流算法
下面对常见的限流算法进行讨论。目前,常用的限流算法主要有三种:计数器法、滑动窗口算法、漏桶算法和令牌桶算法。下面分别介绍其原理。 1. 计数器法 计数器法是通过计数对到来的请求进行选择性处理。如系统限制一秒内最多有X个请求,则在该…...
备战蓝桥杯 Day10(背包dp)
01背包问题 1267:【例9.11】01背包问题 【题目描述】 一个旅行者有一个最多能装 M� 公斤的背包,现在有 n� 件物品,它们的重量分别是W1,W2,...,Wn�1,�2&#…...
Sora 使用教程,新手小白可用
Sora 使用教程,新手小白可用 参考文章:Sora 使用教程,OpenAI 的文生视频模型 为了在激烈的行业竞争中保持领先地位,OpenAI 在 2024 年 2 月 15 日发布了其革命性的文本至视频转换模型——Sora。这个先进的工具能够将文本描述转化…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
