目录结构
-----
|--common
|---add.h add.cpp
|---sub.h sub.cpp
|--src
|---main.cpp
COMMDIR=common
APPDIR=src
COMMSRC:=$(wildcard $(COMMDIR)/*.cpp)
APPSRC:=$(wildcard $(APPDIR)/*.cpp)
COMMDEP:=$(patsubst %.cpp,%.d,$(COMMSRC))
APPDEP:=$(patsubst %.cpp,%.d,$(APPSRC))
COMMOBJ:=$(patsubst %.cpp,%.o,$(COMMSRC))
APPOBJ:=$(patsubst %.cpp,%.o,$(APPSRC))
CPPFLAGS:=-g -Icommon -MD
all:main
deps: $(COMMDEP) $(APPDEP)
main: $(COMMOBJ) $(APPOBJ)
g++ $^ -o $@ -Icommon/
common:$(COMMOBJ)
app:$(APPOBJ)
clean:
@rm -rf main
@find ./ -name *.d | xargs rm -rf
@find ./ -name *.o | xargs rm -rf
-include $(COMMDEP) $(APPDEP)
注意点:
1. CPPFLAGS的定义, 必须加入-MD, 下面是MD在GNU GCC 中文手册的解释
-MD
和`-M'选项类似,但是把依赖信息输出在文件中,文件名通过把输出文件名末尾的
`.o'替换为 `.d'产生.同时继续指定的编译工作---`-MD'不象`-M'那样阻止正常
的编译任务
2. -include 后面紧跟 dep文件的定义
-include file
在处理常规输入文件之前,首先处理文件 file,其结果是,文件 file 的内容先得到编
译. 命令行上任何`-D'和`-U'选项永远在`-include file'之前处理, 无论他们在
命令行上的顺序如何.然而`-include'和`-imacros'选项按书写顺序处理.