
❀保持低旋律节奏->个人主页

经过这章节的学习我们需要知道,程序翻译的最佳实践,是先将文件编译成-o文件,然后再将这些文件统一链接? 为什么?
做到makefile里全是指令符号 无多余的成分。
文章目录
-
- 一、make指令和Makefile文件(makefile)介绍
- [👍二、make、makefile 的实现](#👍二、make、makefile 的实现)
一、make指令和Makefile文件(makefile)介绍
make是一个指令、makefile是一个文件,它的功能是用来描述如何编译当前工程。
要想使用make必须要满足再当前目录下存在makefile文件
例如这是我的makefile文件

这是我的自动化项目

👍二、make、makefile 的实现

1.makefile文件里面的重要概念以及结构
依赖关系和依赖方法
任何一个make 指令 都必须包含依赖关系和依赖方法
依赖关系保证其结构、依赖方法是他们具体实现的方式
目标文件和依赖文件列表cde.exe:code.o
code.exe------目标文件 code.o依赖文件列表
依赖文件列表可以为空
伪目标.PHONY:clean 就表示一个伪目标
特点------为目标总是被执行
那么如何理解伪目标总是被执行的这句话呢?
bash
[ljy@VM-0-12-centos ~]$ make
g++ -c code.c
g++ code.o -o code.exe
[ljy@VM-0-12-centos ~]$ make
make: `code.exe' is up to date.
[ljy@VM-0-12-centos ~]$ make
make: `code.exe' is up to date.
[ljy@VM-0-12-centos ~]$ make
make: `code.exe' is up to date.
bash
[ljy@VM-0-12-centos ~]$ make clean
rm -f code.o code.exe
[ljy@VM-0-12-centos ~]$ make clean
rm -f code.o code.exe
[ljy@VM-0-12-centos ~]$ make clean
rm -f code.o code.exe
我们来观察这两段代码,总结出下面这些点

那么为什么make 编目标只能编一次呢?
gcc、g++再编译代码时如果没有被编译过 那么make就会直接进行编译。但是如果原来文件全部被编译过了(这里指没有被修改、没有被改变MC时间没发生过变化) 那再次编译就会报错。 这种本质上是一个为了提高编译效率的操作。------有效编译即按需编译
那么make如何知道codec是否需要被重新编译呢?
2.ACM时间
输入stat +文件指令 我们可以得出文件的属性及信息
bash
[ljy@VM-0-12-centos ~]$ stat code.c
File: 'code.c'
Size: 99 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 665686 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ ljy) Gid: ( 1001/ ljy)
Access: 2025-12-04 17:45:02.267947502 +0800
Modify: 2025-12-04 17:45:01.314942937 +0800
Change: 2025-12-04 17:45:01.315942942 +0800
Birth: -
Access: 2025-12-04 17:45:02.267947502 +0800 ------被访问时间
Modify: 2025-12-04 17:45:01.314942937 +0800 ------被修改时间(单纯指的是内容)
Change: 2025-12-04 17:45:01.315942942 +0800 ------最近改变事件(属性以及权限)
那么这里需要注意了 , 有几个需要注意的小结论。1.是A代表访问时间,访问在linux中是一个高频操作。因此linux规定 只有我们访问到一定频率后A才会改变一次 ------------有自己的更新策略
M和C,M代表内容被修改过,C代表文件属性修改时间。因此往往文件内容改变 文件属性也会跟着改变。所以M变->C就变
3.M判断源文件是否被修改的指标
Modify
我们由 现有.c文件之后才会有 .exe文件来判断

下面为代码 让你更详细了解 编译成功和编译失败的情况
- 不修改
bash
[ljy@VM-0-12-centos ~]$ make
g++ -c code.c
g++ code.o -o code.exe
[ljy@VM-0-12-centos ~]$ make
make: `code.exe' is up to date.
bash
[ljy@VM-0-12-centos ~]$ stat code.c
File: 'code.c'
Size: 99 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 665686 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ ljy) Gid: ( 1001/ ljy)
Access: 2025-12-04 17:45:02.267947502 +0800
Modify: 2025-12-04 17:45:01.314942937 +0800 !!!17.45
Change: 2025-12-04 17:45:01.315942942 +0800
Birth: -
[ljy@VM-0-12-centos ~]$ stat code.exe
File: 'code.exe'
Size: 8968 Blocks: 24 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 665680 Links: 1
Access: (0775/-rwxrwxr-x) Uid: ( 1001/ ljy) Gid: ( 1001/ ljy)
Access: 2025-12-04 18:19:45.271987784 +0800
Modify: 2025-12-04 18:19:45.014986542 +0800 !!!18.19
Change: 2025-12-04 18:19:45.014986542 +0800
Birth: -
- 修改之后

bash
[ljy@VM-0-12-centos ~]$ stat code.c
File: 'code.c'
Size: 189 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 665686 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ ljy) Gid: ( 1001/ ljy)
Access: 2025-12-04 18:21:54.739613082 +0800
Modify: 2025-12-04 18:21:54.737613072 +0800 !!!此时发现这里更新了!
Change: 2025-12-04 18:21:54.737613072 +0800
Birth: -
[ljy@VM-0-12-centos ~]$ stat code.exe
File: 'code.exe'
Size: 8968 Blocks: 24 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 665680 Links: 1
Access: (0775/-rwxrwxr-x) Uid: ( 1001/ ljy) Gid: ( 1001/ ljy)
Access: 2025-12-04 18:19:45.271987784 +0800
Modify: 2025-12-04 18:19:45.014986542 +0800
Change: 2025-12-04 18:19:45.014986542 +0800
Birth: -
在编写自动化项目的时候 一定要注意缩进! 如果缩进不正确的话那指令就会报错

bash
1 #自动化程序前的准备工作
2 BIN=proc.exe #BIN:所有的exe文件统一为proc.exe
3 OBJ=$(SRC:.c=.o) #OBJ:所有的.c文件转化为同名.o未见
4 SRC=$(shell ls *.c) #SRC:采用shell的命令 列举当前文件所有.c文件
5 CC=gcc #CC: gcc
6 O=-o #O: -o
7 C=-c #C: -c
8 RM=rm -f #RM: rm -f
9
10 #流程
11 $(BIN):$(OBJ) #.exe依赖.o
12 @$(CC) $(O) $@ $^ # $@代表目标文件名 $^代表依赖文件列表
13 @echo "linking $^ to $@" #输出
14 %.o:%.c #.o依赖.c
15 @$(CC) $(C) $< -o $@ #$< 对展开的依赖文件 一个一个交给gcc
16 @echo "compling $< to $@" #输出
17 .PHONY:clean #伪目标clean
18 clean:
19 $(RM) $(OBJ) $(BIN)
20 .PHONY:test #伪目标打印test
21 test:
22 @echo $(SRC)
23 @echo $(OBJ)