Makefile 快速入门
makefile
示例
准备文件如下:
fun1.c
#include<stdio.h>
void fun1()
{
printf("fun1");
}
fun2.c
#include<stdio.h>
void fun1()
{
printf("fun1");
}
main.c
int main()
{
fun1();
fun2();
return 0;
}
目标:将这3个C文件编译,链接成一个可执行文件
命令行的编译方法
首先,分别将C文件编译成中间文件
gcc -c fun1.c -o fun1.o
gcc -c fun2.c -o fun2.o
gcc -c main.c -o main.o
然后将中间文件进行链接
gcc main.o fun1.o fun2.o -o app
虽然可以实现,但如果项目文件多起来,就要输入很多很长的命令
编写第一个Makefile
在目录下创建文件 Makefile,内容遵循以下格式:
目标文件:源文件
(Tab缩进)命令
app: main.o fun1.o fun2.o
gcc main.o fun1.o fun2.o -o app
main.o: main.c
gcc -c fun1.c -o fun1.o
fun1.o: fun1.c
gcc -c fun2.c -o fun2.o
fun2.o: fun2.c
gcc -c main.c -o main.o
然后执行指令:make,即可编译链接生成可执行文件
Makefile的简化
初步简化
通过变量和模式规则,减少输入
obj = main.o fun1.o fun2.o
target = app
CC = gcc
$(target): $(obj)
$(CC) $(obj) -o $(target)
%.o: %.c
$(CC) -c $< -o $@
%.o %.c 即所有的.o、.c后缀的文件
自动变量@,依赖文件和目标
缺点:obj要一个一个输入
进一步简化
-
wildcard
扩展通配符,表示搜索指定文件,比如
src = $(wildcard ./*.c)
代表在当前目录下搜索所有.c文件,然后赋值给src -
patsubst
替换通配符,
obj = (src))
代表将src中所有的.c替换成.o -
make clean
通过编写.PHONY clean,在执行make clean时可以删除中间文件
src = $(wildcard ./*.c)
obj = $(patsubst %.c, %.o, $(src))
target = app
CC = gcc
$(target):$(obj)
$(CC) $(obj) -o $(target)
%.o:%.c
$(CC) -c $< -o $@
.PHONY: clean
clean:
rm -rf $(obj)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现