当前位置: 首页 > news >正文

走进Linux世界:make和makefile

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的
passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let’s go!

请添加图片描述

我的博客:yuanManGan

我的专栏:C++入门小馆 C言雅韵集 数据结构漫游记 闲言碎语小记坊 进阶数据结构 走进Linux的世界 题山采玉 领略算法真谛

在这里插入图片描述


自动化构建工具make,makefile


文章目录

  • 自动化构建工具make,makefile
    • (一) 如何形成可执行程序?
      • 1. 预处理
      • 2. 编译
      • 3. 汇编
      • 4. 链接
    • (二) make和makefile
      • 1. 见一见make/makefile
      • 2. 谈make命令和makefile ---- 依赖关系和依赖方法
      • 3. 详细学习makefile的基本用法
      • 4. 语法细节梳理


(一) 如何形成可执行程序?


当我们写了一个普通的打印 hello worldtest.c 程序的时候,我们如果在vs2022下简单的按一下F5就可以在屏幕上打印hello world,因为vs2022是集成环境,他帮你进行了很多事情。
废话少说,要形成一个可执行程序需要进行一下操作:
1. 预处理
2. 编译
3. 汇编
4. 链接

如果想在Linux下直接生成可执行程序可以使用以下代码:

gcc -o obj src

接下来就慢慢讲一下过程:


1. 预处理

我们预处理阶段,编译器会进行以下操作

  1. 头文件展开
  2. 宏替换
  3. 条件编译
  4. 去注释

如果我们只想对文件进行预处理操作,可以采取以下代码:

gcc -E obj -o src

比如我想预处理 test.c 文件,可以

gcc -E test.c -o test.i

test.c:
在这里插入图片描述
经过预处理之后:
test.i:
在这里插入图片描述
前面800多行是对stdio头文件的展开


2. 编译

将c语言转化为汇编语言

同样的代码:

gcc -S test.i -o test.s

test.s
在这里插入图片描述

3. 汇编

将汇编语言翻译为二进制文件(.o可重定位目标二进制文件)

gcc -c test.s -o test.

注意test.o文件不能直接被运行缺少链接过程

test.o
在这里插入图片描述


4. 链接

将多个目标文件(.o/.obj)和所需的库文件(包括系统库、第三方库)合并为一个可执行程序,同时解决目标文件之间的符号引用(如函数调用、变量引用)。

gcc test.o -o test.exe

test.exe
在这里插入图片描述

(二) make和makefile

如果有单个的程序我们大可使用gcc来形成可执行程序,那100个1000个呢?我们难道还得一个一个打吗?
这时就可以借助自动化构建工具了,我们这里讲解make怎么使用。
我们的 make 本质上是一条命令,而 makefile 是一个文件。


1. 见一见make/makefile

我们先创建一个名为 makefile 的文件

​注意文件名只能是 makefileMakefile
在这里插入图片描述
然后退出来

make

在这里插入图片描述

2. 谈make命令和makefile ---- 依赖关系和依赖方法

在这里插入图片描述
依赖关系就好比月底的你和你的父亲,你们存在依赖关系,你月底了想找你爹要钱,你就是目标文件,你的父亲就是依赖文件列表,你向父亲要钱就是依赖的方法。

3. 详细学习makefile的基本用法

我们可以把关系搞复杂一定,我们进行预处理,编译,汇编,链接这几个过程,这个时候makefile文件就成了:
在这里插入图片描述
在这里插入图片描述
这里产生了一堆 hello.i/s/o/exe 的文件,我们如何清除这些呢?
在这里插入图片描述
在这里插入图片描述

这个.PHONY:先忽略,clean: 后面怎么没有依赖文件,我们可以没有依赖文件,但必须有目标文件和方法,比如你自己不依赖任何人都能吃饭。

clean的方法就是一条shell命令

我们make+目标名就可以使用它的方法,我们如果默认make就是第一个依赖方法。

.PHONY: 目标文件 表示该目标为伪目标,本质是该方法总是被执行。

在这里插入图片描述
我们make之后为什么不能再make呢?

比如我们有100个文件你只修改了一个文件,你难道为了这一个文件,又要再重新编译其他999个文件吗。所以普通文件有一个Modify,可以使用stat来查询
在这里插入图片描述
那这几个时间都和什么有关呢?

Modify: 文件的内容
Change: 文件的属性
Access:查看文件
在这里插入图片描述
在这里插入图片描述
我们发现我们往文件里面写入了东西,不仅Modify时间变了,Change时间也变了,这是为什么呢?

我们的文件属性还包括文件的大小和时间,你往文件里写入东西,不仅改变了文件的大小,还改变了
文件的Modify时间,所以Modify时间的改变往往会伴随着Change时间的改变。

那另一个时间呢?
在这里插入图片描述
当我们cat文件时它可能会变化,那为什么是可能呢?

你想我们对文件进行的操作最多的是什么呢?那当然是查看了,但我们查看操作更改的时间会刷新到硬盘中,我们频繁的刷新硬盘会导致OS整体的效率低下,所以当刷新一定次数,或者一段时间之后才会更新Access时间。

所以当Modify时间发生修改后才能重新makeclean操作将他变成伪目标后可以防止当外部有一个clean文件时,它会总是执行Makefile里面的clean

4. 语法细节梳理

在这里插入图片描述

我们可以这将目标文件和依赖文件这样替换,是不是很像c语言中的宏替换。
$@表示目标文件也就是BIN
$^表示依赖文件列表也就是SRC
在这里插入图片描述
如果你不想把你的命令显示到屏幕上可以在命令前加一个@
在这里插入图片描述
在这里插入图片描述
在我们工程中我们实际上会遇到很多.c文件
在这里插入图片描述
@<表示第一个依赖文件

在这里插入图片描述

http://www.dtcms.com/a/320895.html

相关文章:

  • 深入浅出线程池ThreadPoolExecutor
  • 机器人焊机智能流量调节
  • SwiftUI中的键盘快捷键、初始页面控制及网络权限管理解析
  • linux-LVM 逻辑卷管理
  • Windows域控制器部署最佳实践
  • (1-9-1) Maven 特性、安装、配置、打包
  • 安全扫描:检测到目标站点存在javascript框架库漏洞问题(vue)
  • DQL 超维分析 - 5 集算器 DQL
  • 【网络】TCP/UDP协议
  • 通过上下文工程优化LangChain AI Agents(二)
  • 佳维视高亮度工业显示器,强光环境清晰可见
  • 从深度伪造到深度信任:AI安全的三场攻防战
  • 饿了么零售 sign 分析
  • WPF 动画卡顿
  • 技术速递|GPT-5 正式上线 Azure AI Foundry
  • [激光原理与应用-176]:测量仪器 - 频谱型 - AI分类与检测相对于传统算法的优缺点分析
  • 人工智能与智能家居:家居生活的变革
  • sqlite的sql语法与技术架构研究
  • 安装向量数据库chromadb
  • GPT-5测试后全面解析:性能突破、用户反馈与未来展望
  • 若依前后端分离版学习笔记(七)—— Mybatis,分页,数据源的配置及使用
  • 前后端日期交互方案|前端要传时间戳还是字符串?后端接收时是用Long还是Date还是String?
  • Baumer相机如何通过YoloV8深度学习模型实现危险区域人员的实时检测识别(C#代码UI界面版)
  • 什么是2米分辨率卫星影像数据?
  • JavaScript 对象的解构
  • 5. 缓存-Redis
  • windows 上编译PostgreSQL
  • 极地轨道卫星定位数量问题
  • 数学建模——遗传算法
  • Effective C++ 条款30:透彻了解inlining的里里外外