时候,我们在开发的时候需要将本次工程的代码分成多个子目录来编写,但是在Makefile的编写上却是个问题,下面我就教大家怎么构建带有子文件夹的源代码目录的自动扫描编译
下面这张图是我的文件树
这里面src目录下是我的源代码,我将功能代码分成了三个子模块,分别为test1, test2, test3, 调用这三个子模块的是main.cpp文件,下面我将这三个子模块的代码
<pre name=
"code"
class=
"cpp">
#ifndef __TEST2_H__
#define __TEST2_H__
int test2();
#endif //__TEST2_H__
#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...