Make是一个自动化构建工具,通过读取Makefile文件来自动化编译和构建过程。它主要用于管理软件编译过程,但也可用于其他需要根据文件变更自动更新目标的场景。
一个典型的Makefile包含以下内容:
target: dependencies
command
# 最简单的Makefile示例
hello: hello.c
gcc hello.c -o hello
clean:
rm -f hello
使用:
- make
或 make hello
:编译hello.c生成hello可执行文件
- make clean
:删除生成的文件
CC = gcc
CFLAGS = -Wall -O2
TARGET = myprogram
SRCS = main.c utils.c
OBJS = $(SRCS:.c=.o)
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
$@
: 当前目标名$<
: 第一个依赖文件名$^
: 所有依赖文件列表$?
: 比目标更新的所有依赖文件不生成实际文件的目标:
.PHONY: clean install
clean:
rm -f *.o
install:
cp program /usr/local/bin
DEBUG = 1
ifeq ($(DEBUG),1)
CFLAGS += -g
else
CFLAGS += -O2
endif
include config.mk
make -n
: 显示但不执行命令(干运行)make -B
: 强制重新构建所有目标make -j4
: 使用4个并行任务构建make -f MyMakefile
: 使用指定的Makefile文件-MMD
选项)# 更完整的Makefile示例
CC = gcc
CFLAGS = -Wall -Wextra -MMD
LDFLAGS =
SRC_DIR = src
OBJ_DIR = obj
BIN_DIR = bin
SOURCES = $(wildcard $(SRC_DIR)/*.c)
OBJECTS = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SOURCES))
DEPENDS = $(OBJECTS:.o=.d)
TARGET = $(BIN_DIR)/program
.PHONY: all clean
all: $(TARGET)
$(TARGET): $(OBJECTS) | $(BIN_DIR)
$(CC) $(LDFLAGS) $^ -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
$(BIN_DIR) $(OBJ_DIR):
mkdir -p $@
clean:
rm -rf $(OBJ_DIR) $(BIN_DIR)
-include $(DEPENDS)
这个示例展示了目录结构管理、自动依赖生成等高级特性。