Linux中make和makefile基本使用

目录

1.什么是make,makefile,作用

2.基本概念:目标,依赖,命令

3.makefile基本语法

4.变量:定义和使用,自动变量

5.常用函数wildcard

6.隐含规则

7.调用make


正文开始-->>

1.什么是make,makefile,作用

make 是一个自动化构建工具,根据文件的时间戳判断哪些文件需要重新编译,从而减少重复编译的时间。

Makefile 是 make 读取的配置文件,定义了构建规则、依赖关系和执行命令。

2.基本概念:目标,依赖,命令

一个 Makefile 主要由规则组成,每条规则的格式如下:

复制代码
目标: 依赖项
	命令
  • 目标 (target):通常是要生成的文件名,也可以是伪目标(如 clean)。

  • 依赖项(prerequisites):生成目标所依赖的文件或其他目标。

  • 命令 (recipe):由 Shell 执行的命令,必须以 Tab 键开头。

示例:

复制代码
main: main.cc
	g++ -o main main.cc

执行make时,若main.cc比main新,则执行g++命令。

3.makefile基本语法

  • 注释:以 # 开头。

  • 多目标规则:一个规则可生成多个目标。

  • 伪目标:不代表真实文件,常用于清理等操作,需声明为 .PHONY。

示例:

复制代码
.PHONY: clean
clean:
    rm -f main *.o

4.变量:定义和使用,自动变量

  • 定义变量 :变量名 = 值 或 变量名 := 值(立即展开)。

  • 使用变量 :$(变量名) 或 ${变量名}。

  • 自动变量:

  • $@:目标

  • $^:所有目标依赖

  • $<:目标依赖列表中的第一个依赖

  • $?:所有目标依赖中被修改过的文件

示例:

复制代码
CC = gcc
CFLAGS = -Wall
main: main.cc
	$(CC) $(CFLAGS) -o $@ $^

5.常用函数wildcard

  • 通配符:$(wildcard 模式),如 $(wildcard *.c)
  • 模式替换:$(patsubst 模式,替换,文本),如 $(patsubst %.c,%.o,$(wildcard *.c))
  • 文件操作:$(addprefix 前缀,列表)、$(addsuffix 后缀,列表) 等。

6.隐含规则

make 内置了一些常用规则,例如从 .c 文件生成 .o 文件的规则:

复制代码
%.o: %.c
	$(CC) -c $(CFLAGS) $< -o $@

也可以使用内置变量CC,CFLAGS等自定义

7.调用make

makefile示例:

复制代码
CC = g++
CFLAGS =  -Wall
SRCDIR = src
OBJDIR = obj
SRCS = $(wildcard $(SRCDIR)/*.cc)
OBJS = $(patsubst $(SRCDIR)/%.cc,$(OBJDIR)/%.o,$(SRCS))
TARGET = myapp

$(TARGET): $(OBJS)
	$(CC) -o $@ $^

$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
	$(CC) $(CFLAGS) -c $< -o $@
.PHONY: clean
clean:
	rm -rf $(OBJDIR) $(TARGET)

常用make命令选项:

  • make:默认执行第一个目标。

  • make 目标:指定构建的目标。

  • make -n:打印要执行的命令但不执行(dry run)。

  • make -B:强制重新编译所有目标。

  • make -d:打印调试信息。

  • make -jN:并行执行 N 个任务

好了,关于make,makefile基本的使用就到这里结束了,希望各位大佬点个赞,拜!~~~

相关推荐
whyutianict_vv16 分钟前
云计算 HCIE 认证体系解析:HCIA/HCIP/HCIE 三级科目与知识边界
linux·运维·云计算
0+1117 小时前
Linux --从 poll 到 epoll多路转接
linux·服务器·1024程序员节
青瓦梦滋7 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
桌面运维家8 小时前
旧电脑跑不动课程软件,VDI云桌面怎样接着用?
运维·服务器·虚拟化·pve·vdi·云桌面
zhang133830890758 小时前
传统机械三杯式风速传感器易磨损冻堵?CG-88金属超声波风速风向传感器给出免运维方案
运维·服务器·网络·人工智能·自动化
知已难寻8 小时前
第 2 篇 · 云的地基:服务器、存储、网络三大基础设施
运维·服务器·网络·云原生·云计算·负载均衡·1024程序员节
2601_9498477510 小时前
bcrypt.js 跨端三方库仓颉适配全流程
linux·运维·ubuntu
m0_6399069410 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端
今天重构了吗11 小时前
Linux 上 rm -rf 删错了能找回吗
运维·服务器
KaiwuDB11 小时前
KaiwuDB 分布式集群扩缩容,从原理到完整操作踩坑总结
运维·数据库·分布式