Makefile学习笔记
1. Makefile规则
target: prerequisites
command
目标文件:依赖文件
编译的命令
2. 举例学习
2.1 在同一个目录创建三个文件
$ tree
.
+-- func1.c
+-- func1.h
+-- func2.c
+-- func2.h
+-- main.c
+-- Makefile
func1.c
----------------------------------
#include <stdio.h>
#include "func1.h"
void func1()
{
printf("%s\n", __func__);
}
----------------------------------
func1.h
----------------------------------
#ifndef _FUNC1_H_
#define _FUNC1_H_
void func1(void);
#endif
----------------------------------
func2.c
----------------------------------
#include <stdio.h>
#include "func1.h"
void func2()
{
printf("%s\n", __func__);
}
----------------------------------
func2.h
----------------------------------
#ifndef _FUNC1_H_
#define _FUNC1_H_
void func2(void);
#endif
----------------------------------
main.c
----------------------------------
#include "func1.h"
#include "func2.h"
int main(void)
{
func1();
func2();
return 0;
}
----------------------------------
Makefile
----------------------------------
# 连接生成可执行文件,用-o指定生成的文件名称
main: main.o func1.o func2.o
gcc -o main main.o func1.o func2.o
# 编译生成.o目标文件
main.o: main.c
gcc -c main.c
func1.o: func1.c func1.h
gcc -c func1.c
func2.o: func2.c func2.h
gcc -c func2.c
clean:
rm main *.o
----------------------------------
make输出结果:
gcc -c main.c
gcc -c func1.c
gcc -c func2.c
gcc -o main main.o func1.o func2.o
2.2 更改层次结构,将.c和.h分别放到src和inc目录。
$ tree
.
+-- inc
¦ +-- func1.h
¦ +-- func2.h
+-- main.c
+-- Makefile
+-- src
+-- func1.c
+-- func2.c
Makefile
----------------------------------
# 链接生成可执行文件
main: main.o src/func1.o src/func2.o
gcc -I./inc -o main main.o src/func1.o src/func2.o
# -c生成.o目标文件
main.o: main.c
gcc -I./inc -c main.c
# 生成目标文件,用-o指定放在src目录
# 目标文件和依赖文件以及编译的时候,都需要添加路径
src/func1.o: src/func1.c
gcc -I./inc -o src/func1.o -c src/func1.c
src/func2.o: src/func2.c
gcc -I./inc -o src/func2.o -c src/func2.c
clean:
rm main main.o src/func1.o src/func2.o
----------------------------------
输出结果
gcc -I./inc -c main.c
gcc -I./inc -o src/func1.o -c src/func1.c
gcc -I./inc -o src/func2.o -c src/func2.c
gcc -I./inc -o main main.o src/func1.o src/func2.o
另外一种写法
----------------------------------
SRC_PATH += .
SRC_PATH += ./src
CFLAGS += -I./inc
C_FILES += $(foreach dir, $(SRC_PATH), $(wildcard $(dir)/*.c))
# 通过warning函数打印结果
$(warning C_FILES: $(C_FILES))
OBJS = $(patsubst %.c, %.o, $(C_FILES))
$(warning OBJS : $(OBJS))
main: $(OBJS)
$(CC) -o main $(OBJS)
clean:
rm main $(OBJS)
----------------------------------
输出结果
Makefile:8: C_FILES: ./main.c ./src/func1.c ./src/func2.c
Makefile:10: OBJS : ./main.o ./src/func1.o ./src/func2.o
cc -I./inc -c -o main.o main.c
cc -I./inc -c -o src/func1.o src/func1.c
cc -I./inc -c -o src/func2.o src/func2.c
cc -o main ./main.o ./src/func1.o ./src/func2.o
# $(foreach <var>,<list>,<text>)
# 这个函数的意思是,把参数<list>;中的单词逐一取出放到参数<var>;所指定的变量中,然后再执行< text>;所包含的表达式。每一次<text>;会返回一个字符串,循环过程中,<text>;的所返回的每个字符串会以空格分隔,
# wildcart把指定目录的.c文件全部展开
#格式:$(patsubst pattern,replacement,text)
#名称:模式字符串替换函数——patsubst。
#功能:查找text中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式pattern,如果匹配的话,则以replacement替换。
分类:
tools
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
2018-07-12 Wifi 评分机制分析