时候,我们在开发的时候需要将本次工程的代码分成多个子目录来编写,但是在Makefile的编写上却是个问题,下面我就教大家怎么构建带有子文件夹的源代码目录的自动扫描编译

下面这张图是我的文件树

这里面src目录下是我的源代码,我将功能代码分成了三个子模块,分别为test1, test2, test3, 调用这三个子模块的是main.cpp文件,下面我将这三个子模块的代码

  • <pre name= "code" class= "cpp"> //  src/test2/test2.h
  • #ifndef __TEST2_H__
  • #define __TEST2_H__
  • int test2();
  • #endif //__TEST2_H__
  • // src/test2/test2.cpp
  • #include "test2.h"
  • int test2() {
  • return 2;
  • # 为了更大幅度的支持项目的搭建,将三种文件格式的后缀都单独便利到变量中
  • SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp))
  • SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc))
  • SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c))
  • OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP))
  • OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC))
  • OBJS_C = $(patsubst %.c, %.o, $(SRCS_C))
  • SRC_PATH = $(TOP_PATH)/ src MOD_PATH = $(TOP_PATH)/ modules MOD_LIB_PATH = $(MOD_PATH)/ lib MOD_INC_PATH = $(MOD_PATH)/ include DIRS = $(shell find $(SRC_PATH) -maxdepth 3 - type d) FILES = $(foreach dir , $(DIRS), $(wildcard $( dir ) /* .cpp)) ########################################################## # modules ########################################################## modules = MODULES_PATH = $(foreach m, $(modules), $(MOD_PATH)/$(m)) ########################################################## # srcs ########################################################## SRCS_CPP += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cpp)) SRCS_CC += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.cc)) SRCS_C += $(foreach dir, $(DIRS), $(wildcard $(dir)/*.c)) ########################################################## # objs ########################################################## OBJS_CPP = $(patsubst %.cpp, %.o, $(SRCS_CPP)) OBJS_CC = $(patsubst %.cc, %.o, $(SRCS_CC)) OBJS_C = $(patsubst %.c, %.o, $(SRCS_C)) ########################################################## # paths ########################################################## INC_PATH += -I$(MOD_INC_PATH) INC_PATH += -I$(MOD_PATH) LIB_PATH += -L$(TOP_PATH)/lib LIB_PATH += -L$(MOD_LIB_PATH) ########################################################## # libs ########################################################## ########################################################## # building ########################################################## all:$(TARGET) $(TARGET) : $(OBJS_CPP) $(OBJS_CC) $(OBJS_C) @ for i in $(MODULES_PATH); \ make -C $$i; \ @ $(CXX) $^ -o $@ $(LIB_PATH) $(LIBS) @ echo Create $(TARGET) ok... $(OBJS_CPP):%.o : %.cpp $(CXX) $(CFLAGS) $< -o $@ $(INC_PATH) $(OBJS_CC):%.o : %.cc $(CXX) $(CFLAGS) $< -o $@ $(INC_PATH) $(OBJS_C):%.o : %.c $(CXX) $(CFLAGS) $< -o $@ $(INC_PATH) .PHONY : clean clean: @ $(RM) $(TARGET) $(OBJS_CPP) $(OBJS_CC) $(OBJS_C) @ for i in $(MODULES_PATH); \ make clean -C $$i; \ @echo clean all...