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

 

posted @ 2025-11-14 14:03  年华似水゛  阅读(5)  评论(0)    收藏  举报