即使有子文件夹也能处理。
Makefile:
.PHONY: clean all # annotation when release version DEBUG := TARGET_PROG := main.out # project directory DEBUG_DIR := ./debug RELEASE_DIR := ./release BIN_DIR := $(if $(DEBUG), $(DEBUG_DIR), $(RELEASE_DIR)) # shell command CC := gcc CXX := g++ RM := rm -rf MKDIR := mkdir -p SED := sed MV := mv # init sources & objects & depends sources_all := $(shell find . -name "*.c" -o -name "*.cpp" -o -name "*.h") sources_c := $(filter %.c, $(sources_all)) sources_cpp := $(filter %.cpp, $(sources_all)) sources_h := $(filter %.h, $(sources_all)) objs := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.o) $(sources_c:.c=.o))) deps := $(addprefix $(BIN_DIR)/,$(strip $(sources_cpp:.cpp=.d) $(sources_c:.c=.d))) # create directory $(foreach dirname,$(sort $(dir $(sources_c) $(sources_cpp))), $(shell $(MKDIR) $(BIN_DIR)/$(dirname))) # complie & link variable CFLAGS := $(if $(DEBUG),-g -O, -O2) CFLAGS += $(addprefix -I ,$(sort $(dir $(sources_h)))) CXXFLAGS = $(CFLAGS) LDFLAGS := LOADLIBES += #-L/usr/include/mysql LDLIBS += #-lpthread -lmysqlclient # add vpath vpath %.h $(sort $(dir $(sources_h))) vpath %.c $(sort $(dir $(sources_c))) vpath %.cpp $(sort $(dir $(sources_cpp))) # generate depend files # actually generate after object generated, beacasue it only used when next make) ifneq "$(MAKECMDGOALS)" "clean" sinclude $(deps) endif # make-depend(depend-file,source-file,object-file,cc) define make-depend $(RM) $1; $4 $(CFLAGS) -MM $2 | $(SED) ‘s,\($(notdir $3)\): ,$3: ,‘ > $1.tmp; $(SED) -e ‘s/#.*//‘ -e ‘s/^[^:]*: *//‘ -e ‘s/ *\\$$//‘ -e ‘/^$$/ d‘ -e ‘s/$$/ :/‘ < $1.tmp >> $1.tmp; $(MV) $1.tmp $1; endef # rules to generate objects file $(BIN_DIR)/%.o: %.c @$(call make-depend,$(patsubst %.o,%.d,[email protected]),$<,[email protected],$(CC)) $(CXX) $(CFLAGS) -o [email protected] -c $< $(BIN_DIR)/%.o: %.cpp @$(call make-depend,$(patsubst %.o,%.d,[email protected]),$<,[email protected],$(CXX)) $(CXX) $(CXXFLAGS) -o [email protected] -c $< # add-target(target,objs,cc) define add-target REAL_TARGET += $(BIN_DIR)/$1 $(BIN_DIR)/$1: $2 $3 $(LDFLAGS) $$^ $(LOADLIBES) $(LDLIBS) -o [email protected] endef # call add-target $(foreach targ,$(TARGET_PROG),$(eval $(call add-target,$(targ),$(objs),$(CXX)))) all: $(REAL_TARGET) clean: $(RM) $(BIN_DIR)
看看示例工程的编译过程:
编译完成后,我们看看是运行效果:
示例工程见:百度网盘\软件源码\testGeneralMakefile.tar.gz
完。
时间: 2025-01-02 13:50:07