makefile
最简单的makefile 的demo
TARGET := app
# 在这里添加.c 的路径,#include自己的.h时需要指定相对路径
SRCS := main.c d1/d1.c
OBJS := $(SRCS:.c=.o)
DEP_FILES := $(SRCS:.c=.d) # 依赖文件:每个 .c 对应 .d
CFLAGS := -Wall -g -MMD -MP -I. # -MMD:生成 .d 文件;-MP:添加伪目标避免报错 -I. 表示当前目录作为头文件查找路径
# 链接选项(若用到第三方库,如 -lm 链接数学库,可加在这里)
LDFLAGS := -luv -lpthread
$(TARGET): $(OBJS)
gcc $(OBJS) -o $(TARGET) $(LDFLAGS)
@echo "OK! :./$(TARGET)"
# 通用 .o 规则(无需手动写 .h 依赖,.d 文件会自动包含)
%.o: %.c
gcc $(CFLAGS) -c $< -o $@
# 包含所有 .d 文件(让 Make 识别头文件依赖)
-include $(DEP_FILES) # -:忽略文件不存在的错误
.PHONY: clean
clean:
rm -f $(TARGET) $(OBJS) $(DEP_FILES) # 清理 .d 文件
.PHONY: rebuild
rebuild: clean $(TARGET)
自动扫描指定路径下的.c 和h 文件
# 1. 最终可执行文件
TARGET := app
# 2. 源码目录 .c(新增目录直接往这里加)
SRC_DIR := .
# 3. 头文件目录 .h(-I 用)
INC_DIR := .
# 4. 自动扫描所有.c
SRCS := $(foreach d,$(SRC_DIR),$(wildcard $(d)/*.c))
# 7. 编译/链接参数
CC := gcc
# std=c11 当使用 -std=c11编译时,GCC 会严格遵循 C11 标准,不自动包含 POSIX 扩展,导致编译器无法识别 usleep的声明
# gnu11 在编译选项中添加 -std=gnu11,允许 GCC 支持 GNU 扩展和 POSIX 函数
CFLAGS := -Wall -Wextra -std=gnu11 -g -Wno-unused-parameter -MMD -MP # -MMD:生成 .d 文件;-MP:添加伪目标避免报错
CFLAGS += $(addprefix -I,$(INC_DIR)) # 告诉编译器,.h 文件的路径
# ld file : -lpthread -luv .etc
LDFLAGS := -lpthread
# 8. 把 SRCS 重新映射成 build 里的 .o,**保留相对子目录结构**
# 例:plugins/dera/dera-nvme.c -> build/plugins/dera/dera-nvme.o
OBJS := $(SRCS:%.c=build/%.o)
# 9. 自动生成依赖文件
DEPS := $(OBJS:.o=.d)
# 10. 默认目标
all: $(TARGET)
# 11. 链接
$(TARGET): $(OBJS)
@echo "LDFLAGS: $(LDFLAGS)"
$(CC) -o $@ $^ $(LDFLAGS) # LDFLAGS一定要放在最后面,不然会出问题
# 12. 编译规则:创建子目录 + 生成 .o + 生成 .d
build/%.o: %.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
# 13. 包含依赖文件(若存在)
-include $(DEPS)
# 14. 清理
clean:
rm -rf build $(TARGET)
.PHONY: all clean

浙公网安备 33010602011771号