Makefile是Linux/Unix系统中用于自动化编译和构建项目的工具,下面我将详细介绍如何使用Makefile。
Makefile由一系列规则组成,每条规则格式如下:
target: dependencies
command
Makefile
的文件(无扩展名)# 最简单的Makefile示例
hello:
echo "Hello, World!"
make hello
# 定义变量
CC = gcc
CFLAGS = -Wall -g
# 默认目标
all: myprogram
# 编译主程序
myprogram: main.o utils.o
$(CC) $(CFLAGS) -o myprogram main.o utils.o
# 编译各个源文件
main.o: main.c utils.h
$(CC) $(CFLAGS) -c main.c
utils.o: utils.c utils.h
$(CC) $(CFLAGS) -c utils.c
# 清理生成的文件
clean:
rm -f *.o myprogram
CC = gcc
CFLAGS = -Wall -O2
target: dependency
$(CC) $(CFLAGS) -o target dependency.c
$@
: 当前目标名$<
: 第一个依赖文件名$^
: 所有依赖文件列表%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
用于不是实际文件名的目标:
.PHONY: clean
clean:
rm -f *.o program
make
make target_name
make -n
make -j4
(使用4个线程)ifeq ($(DEBUG),1)
CFLAGS += -DDEBUG
endif
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c,%.o,$(SRCS))
include config.mk
# 定义编译器
CC = gcc
# 编译选项
CFLAGS = -Wall -Wextra -O2
# 链接选项
LDFLAGS =
# 源文件目录
SRCDIR = src
# 头文件目录
INCDIR = include
# 源文件列表
SRCS = $(wildcard $(SRCDIR)/*.c)
# 目标文件列表
OBJS = $(patsubst $(SRCDIR)/%.c,%.o,$(SRCS))
# 最终目标
TARGET = myapp
# 默认目标
all: $(TARGET)
# 链接目标
$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^
# 编译规则
%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -I$(INCDIR) -c $< -o $@
# 清理
clean:
rm -f $(OBJS) $(TARGET)
.PHONY: all clean
make -d
显示详细调试信息make --debug
显示不同级别的调试信息make -p
打印所有规则和变量通过合理使用Makefile,可以大大简化项目的编译和管理过程,特别是在大型项目中。