样例4只能编译纯C文件,现在添加C++的支持。
同时添加环境变量CROSS_COMPILE支持灵活跨平台编译。
源代码根目录为src,所有源码在src的子目录会被编译。
bash
#CROSS_COMPILE ?=
CC = $(CROSS_COMPILE)gcc
CXX = $(CROSS_COMPILE)g++
LD = $(CROSS_COMPILE)g++
STRIP = $(CROSS_COMPILE)strip
#编译选项
DEFINES = -DTEST=1
CFLAGS = -O0 -Wall -Wformat-overflow=0 $(DEFINES)
CXXFLAGS = -O0 -Wall -Wformat-overflow=0 $(DEFINES)
LDFLAGS = -Wl,-gc-sections -Wl,-rpath=lib -Wl,-rpath='$$ORIGIN' -lpthread -lm
#目录结构
target = main
srcdir = src
objdir = build
srcsub = $(shell find $(srcdir) -type d)
objsub = $(patsubst $(srcdir)/%,$(objdir)/%,$(srcsub))
#源文件查找
csrc = $(foreach dir,$(srcsub),$(wildcard $(dir)/*.c))
cxxsrc = $(foreach dir,$(srcsub),$(wildcard $(dir)/*.cpp))
obj = $(patsubst $(srcdir)/%.c,$(objdir)/%.o,$(csrc)) $(patsubst $(srcdir)/%.cpp,$(objdir)/%.o,$(cxxsrc))
dep = $(patsubst $(srcdir)/%.c,$(objdir)/%.d,$(csrc)) $(patsubst $(srcdir)/%.cpp,$(objdir)/%.d,$(cxxsrc))
#包含路径
CFLAGS += $(foreach dir,$(srcsub),-I$(dir))
CXXFLAGS += $(foreach dir,$(srcsub),-I$(dir))
LDFLAGS += $(foreach dir,$(srcsub),-L$(dir))
#依赖生成规则
$(objdir)/%.d: $(srcdir)/%.c
@echo "Generating $@..."
@$(CC) -MM -MT "$(@:.d=.o) $@" $(CFLAGS) $< > $@
$(objdir)/%.d: $(srcdir)/%.cpp
@echo "Generating $@..."
@$(CXX) -MM -MT "$(@:.d=.o) $@" $(CXXFLAGS) $< > $@
#编译规则
$(objdir)/%.o: $(srcdir)/%.c
@echo "Compiling $<..."
@$(CC) $(CFLAGS) -c $< -o $@
$(objdir)/%.o: $(srcdir)/%.cpp
@echo "Compiling $<..."
@$(CXX) $(CXXFLAGS) -c $< -o $@
ifeq ($(MAKELEVEL), 1)
include $(dep)
endif
.PHONY: all clean
all: $(objsub) $(dep)
@$(MAKE) -s $(target)
clean:
@echo Clean target...
@rm -rf $(target) $(objdir)
@echo Clean done!
$(objsub):
@mkdir -p $@
$(target): $(obj)
@echo Linking...
@$(LD) $(LDFLAGS) -o $@ $^
@$(STRIP) $@
@echo Build done!