linux——make/Makefile自动化工程构建


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

专栏链接:《C++学习》《Linux学习》


经过这章节的学习我们需要知道,程序翻译的最佳实践,是先将文件编译成-o文件,然后再将这些文件统一链接? 为什么?
做到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)
相关推荐
ScilogyHunter12 分钟前
GCC完全指南
linux·gcc
CodeStats21 分钟前
从 CPU 指令到 JVM 进程:彻底讲透 Java 执行 main 方法时,类加载、主线程、栈帧入栈的完整底层逻辑
java·linux·开发语言
测试员周周33 分钟前
【AI测试智能体-面试】AI测试面试60题(附回答思路)
人工智能·python·功能测试·测试工具·单元测试·自动化·测试用例
asyxchenchong8881 小时前
最新Hermes Agent 技能封装与科研自动化:以 Meta-Analysis 为例-实现从文献检索到绘图的一站式工作流
运维·人工智能·自动化
tianyuanwo1 小时前
项目内自我管理:一名OS领域DevOps的破局之路
运维·devops
三十..2 小时前
Redis 核心原理与高可用架构实践
运维·数据库·redis
richard_yuu2 小时前
C#工业上位机项目实战第九篇:可视化流程引擎完整落地,节点拖拽、连线渲染与自动化调度
c#·自动化
努力努力再努力wz2 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
Jurio.3 小时前
开源 Codex Sticky:在终端 Codex CLI 长对话中始终固定底部输入框
linux·rust·github·开源软件·codex·codex cli
无足鸟ICT3 小时前
【RHCA+】撤销和恢复撤销快捷键
linux