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)
相关推荐
赖small强1 小时前
【Linux C/C++开发】Linux C/C++ 高效延迟崩溃分析:基于 mprotect 的内存陷阱技术 (Electric Fence)
linux·c语言·c++·mprotect·buffer overflow
繁华似锦respect1 小时前
C++ & Linux 中 GDB 调试与内存泄漏检测详解
linux·c语言·开发语言·c++·windows·算法
爱潜水的小L1 小时前
自学嵌入式day25,树
linux
周杰伦_Jay1 小时前
【Linux Shell】命令完全指南
linux·运维·服务器
乾元1 小时前
SDN 与 AI 协同:控制面策略自动化与策略一致性校验
运维·网络·人工智能·网络协议·华为·系统架构·ansible
qq_479875431 小时前
protobuf[2]
linux
sky北城1 小时前
Linux的回收站机制实现方式总结
linux·运维·服务器
代码游侠1 小时前
复习——栈、队列、树、哈希表
linux·数据结构·学习·算法
橘子真甜~2 小时前
C/C++ Linux网络编程10 - http协议
linux·服务器·网络·c++·网络协议·http