特别是在c++的模板编写中,因为修改的都是.h文件。如果makefile 中没有设置.o文件依赖于相应的.h文件,将导致make的时候提示说
make: `bin/runner’ is up to date
y核心就是让.o文件能依赖相应的.h文件。一种简单的方法就是让每个.o文件depend on 所有的.h文件。但是会导致一个.h文件更改,所有的.o文件都要重新编译。最佳的办法就是通过编译器来输出.o文件所依赖的所有.h文件,生成.d文件。确定每个.o文件所依赖的.h文件。下面这个makefile就可以在.h文件更新的时候重新编译相应的.o文件:
CC :=g++
LD :=g++
SRCDIR := src
BUILDDIR := build
TARGET :=bin/runner
SRCEXT:=cpp
SOURCES:=$(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
OBJECTS:=$(patsubst $(SRCDIR)/%, $(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
DEP:=$(OBJECTS:%.o=%.d)
CFLAGS:= -std=c++11
LDFLAGS:=
INC:= -I include
$(TARGET):$(OBJECTS)
@echo "Linking..."
@echo "$(LD) $^ -o $(TARGET) $(LIB)"
$(LD) -o $(TARGET) $^ $(LDFLAGS)
-include $(DEP)
$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
@mkdir -p $(sort $(dir $(OBJECTS)))
@echo "$(CC) $(CFLAGS) $(INC) -c -o $@ $<"
$(CC) $(CFLAGS) $(INC) -MM -MT $@ -MF $(patsubst %.o, %.d, $@) $<
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
#$(CC) $(CFLAGS) -MMD -c -o $@ $<
clean:
@echo "cleaning...";
@echo "$(RM) -r $(BUILDDIR) $(TARGET)";
$(RM) -r $(BUILDDIR) $(TARGET)
.PHONY:clean
另: 我的工程文件格式:
├── bin
│ ├── runner
│
├── build
│ ├── main.d
│ ├── main.o
│ ├── str_proc.d
│ └── str_proc.o
├── include
│ └── str_proc.hpp
├── makefile
├── makefile.bak
├── src
├── main.cpp
└── str_proc.cpp
主要参考资料:
stack overflow1
stack overflow2
A Simple C++ Project Structure - Hiltmon