makefile: 如何在.h文件更新之后,相应的.o文件能重新编译

特别是在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

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值