问题所在:
每次执行make命令,都要重新编译所有的文件。
情况:
目标文件(.o)与源文件(.cpp)不在同一个目录下面。编译的文件又比较多,所以使用匹配模式来编译,语句如下:.cpp.o: CC $(INCLUDE) -c $< -o $(BUILDHOME)/$@
程序生成:$(TARGET) : $(OBJ)
$(CC) $(LIBS) $(ABSOBJ) -o $(BINDIR)/$@
其中$(ABSOBJ)是所有.o文件的真实路径,$(OBJ)是与.cpp文件对应的.o的文件名
TARGET的依赖文件写成OBJ,是想自动匹配:.cpp.o: CC $(INCLUDE) -c $< -o $(BUILDHOME)/$@,生成 ABSOBJ
原因:
make执行的时候会自动检查目标文件与源文件的日期,如果目标文件比源文件旧或者目标文件不存在则会重新编译目标文件。make命令查找到TARGET依赖OBJ,会去编译OBJ,但是OBJ不存在(因为在前一次执行编译的时候生成的是ABSOBJ),所以make还会匹配:.cpp.o: 重新编译。
解决方法:
之所以采取上述比较怪异的做法,是因为不知道如何批处理的将源代码编译到别的目录,而不是当前目录
事实上可以这样实现:
$(BUILD_HOME)/%.o: %.cpp
$(CC) -I$(INCLUDES) -c $< -o $@
然后TARGET
呵呵,很简单吧,可是事先就是没想到,初次接触makefile。
感觉自己写的还不是很有条理,反正是随便写写的,暂时也没有时间整理,通过经常这样写写来提高自己的语言表达能力和文字功底吧。