Makefile
创建:2025-04-20 00:07
更新:2025-04-20 00:07

快速实现一个C/C++的项目编译Makefile.

只需要添加目录,就可以自动在目录下搜索所有的 .c文件(这个例子中仅展示.c, .cpp同理,注意修改编译器为g++)。根据gcc -MM -MT自动获取依赖的文件,组成依赖关系

export MAKEFLAGS += --no-print-directory

SRCDIR += ./ ./common/ ./handler/  ## 源代码目录列表
INCLUDE += ./  ## 头文件列表


GOALNAME ?= app ## 编译目标名
CFLAGS += -g -D__debug__ -Wall -Werror -Wno-dangling-else ## 编译参数
LDFLAGS += -lpthread -lm -rdynamic ## 链接参数
BUILDDIR = ./build/$(GOALNAME)/ ## 构建目录

SOURCES += $(foreach dir, $(SRCDIR), $(wildcard $(dir)*.c)) ## 展开获得所有的头文件
OBJECTS += $(foreach obj, $(patsubst $(dir)%.c, $(BUILDDIR)%.o, $(SOURCES:.c=.o)), $(BUILDDIR)$(obj)) ## 获得目标文件
DEPENDENCIES := $(foreach dep, $(patsubst $(dir)%.c, $(BUILDDIR)%.d, $(SOURCES:.c=.d)), $(BUILDDIR)$(dep)) ## 获得编译的时候依赖的.d文件
INCLUDES = $(patsubst %,-I %,$(INCLUDE)) ## 展开include
ECHO = printf "%b\n" # 为了能正确显示颜色

build: $(GOALNAME)
    @:

$(GOALNAME): $(OBJECTS) $(LIBRARY)
    @$(ECHO) "\033[32m> ld $@ $(RELASE_INFO) \033[0m"
    @gcc -o $@ $^ $(LDFLAGS)

$(BUILDDIR)%.d: %.c
    @mkdir -p $(BUILDDIR)$(dir $<)
    @$(ECHO) "\033[32m> mm $< \033[0m"
    @gcc -MM -MT $(BUILDDIR)$*.o $(CFLAGS) $(INCLUDES) $< -o $@

$(BUILDDIR)%.o: %.c
    @mkdir -p $(BUILDDIR)$(dir $<)
    @$(ECHO) "\033[32m> cc $< $(RELASE_INFO) \033[0m"
    @gcc -c $(CFLAGS) $(INCLUDES) $< -o $@

# 这个过滤掉不需要构建依赖目标的任务,例如clean,避免clean的时候也去生成.d文件
FILTER_GOALS += clean
ifeq ($(filter $(FILTER_GOALS),$(MAKECMDGOALS)),)
ifneq ("$(MAKECMDGOALS)","")
-include $(DEPENDENCIES)
endif
endif

clean:
    rm -rf $(BUILDDIR) $(GOALNAME)
    @$(ECHO) "\033[32m> clean success $< \033[0m"

.PHONY: clean build