makefile 自动处理头文件的依赖关系

示例Makefile

 #rule.make

CC=g++
MAKE=make
AR=ar cr
RM=rm -rf

#CFLAGS+=-Wall

OBJDIR=.out
SRCSCPP=$(wildcard *.cpp)
SRCSC=$(wildcard *.c)
OBJS=$(SRCSCPP:%.cpp=$(OBJDIR)/%.o) $(SRCSC:%.c=$(OBJDIR)/%.o)
DEPENDS=$(SRCSCPP:%.cpp=$(OBJDIR)/%.d) $(SRCSC:%.c=$(OBJDIR)/%.d)

.PONEY: clean  all

all:$(TARGET)  $(LIB) subdirs $(DEPENDS)

$(LIB):$(OBJS) 
    @mkdir -p $(LIBPATH)
    @$(AR)  $(LIBPATH)/$@  $^
    @echo create $@

$(TARGET):$(OBJS)
    @mkdir -p $(EXEPATH)
    @$(CC) -o $(EXEPATH)/$@ $^ $(LDFLAGS)
    @echo create $@

subdirs:$(SUBDIRS)
    @for dir in $(SUBDIRS);\
    do $(MAKE) -C $$dir all||exit 1;\
    done

$(OBJDIR)/%.o:%.cpp $(OBJDIR)/%.d
    @mkdir -p $(OBJDIR)
    @$(CC) -c $< -o $@ $(CFLAGS)
    @echo "Compile $<"

$(OBJDIR)/%.o:%.c $(OBJDIR)/%.d
    @mkdir -p $(OBJDIR)
    @$(CC) -c $< -o $@ $(CFLAGS)
    @echo "Compile $<"

#-include $(DEPENDS)

$(OBJDIR)/%.d:%.c
    @mkdir -p $(OBJDIR)
    @set -e; rm -f $@;\
    $(CC) -MM $(CFLAGS) $< > $@.$$$$;\
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\
    rm -f $@.$$$$

$(OBJDIR)/%.d:%.cpp
    @mkdir -p $(OBJDIR)
    @set -e; rm -f $@;\
    $(CC) -MM $(CFLAGS) $< > $@.$$$$;\
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\
    rm -f $@.$$$$

clean:
    @for dir in $(SUBDIRS);\
    do \
    echo "clean dir $$dir";\
    $(MAKE) -C $$dir clean||exit 1;\
    done
    @-$(RM) $(TARGET) $(LIB)  $(OBJDIR)

#Makefile lib

TOPDIR=..

LIB=libsourcecmd.a

LIBPATH=$(TOPDIR)/.lib/

CFLAGS= -I./\
        -I../../comm/libs/utils\
        -I../../comm/libs3/mysql/include\
        -I../../comm/libs3\
        -I../../comm/libs3/libuv-1.x/include


include $(TOPDIR)/rules.make

#Makefile exe

TOPDIR=..

TARGET=cmu

EXEPATH=$(TOPDIR)/bin

LIBPATH=-L$(TOPDIR)/.lib\
        -L../../comm/libs3/libuv-1.x/.libs\
        -L../../comm/share/.lib\
        -L../../comm/libs/asio/.lib\
        -L../../comm/libs/db/.lib\
        -L/usr/lib64/mysql

CFLAGS= -I./\
        -I../../comm/libs/utils\
        -I../../comm/libs3/mysql/include\
        -I../../comm/libs3\
        -I../../comm/libs3/libuv-1.x/include
        
        
LDFLAGS= $(LIBPATH) -lsourcecmd -lsourcedb -ldb -lasio -lshare -lm -ldl -lpthread -luv -lmysqlclient


include $(TOPDIR)/rules.make

说明:

include $(DEPENDS)包含头文件依赖文件很多事是会导致反应慢和两次进入子目录问题

 参考:

头文件依赖关系

https://blog.csdn.net/dragon101788/article/details/30580349

层级makefile

https://www.cnblogs.com/coderkian/p/3479564.html

猜你喜欢

转载自www.cnblogs.com/mingzhang/p/11308337.html