makefile学习过程中的一些坑

在这里插入图片描述
makefile工作所创建编译的目录结构如上图所示。

在学习驾驭makefile时,里面在创建dep依赖文件时,用include包含进来后,或发生死循环的现象,原因是一直依赖于文件夹,而文件夹因为每次文件的创建更改导致文件夹的时间也跟着变化。解决办法是首先判断文件夹是否存在,然后如果不存在,就将文件名赋值给一个变量,让dep依赖于新创建的变量,而不是原来的dep文件夹的名字。

CC=gcc
RM=rm
MKDIR=mkdir
DIR_OBJ=obj
DIR_INC=inc
DIR_EXE=exe
DIR_O=o
DIR_DEPS=deps
DIR=${DIR_EXE} ${DIR_O} ${DIR_DEPS}
.PHNOY:all clean
C_SOURCE=${wildcard obj/*.c}
C_SOURCE:=${C_SOURCE:obj/%=%}
DEPS:=${C_SOURCE:%.c=%.dep}
DEPS:=${addprefix ${DIR_DEPS}/,${DEPS}}
O_DES:=${C_SOURCE:.c=.o}
O_DESTINATION:=${addprefix ${DIR_O}/,${O_DES}}
EXE=${DIR_EXE}/main
INC_DIR:=${addprefix -I ,${DIR_INC}}
all:${EXE}

这里判断文件是否存在,然后如果不存在就赋值,后面会根据依赖创建文件夹,如果存在,就不赋值,也就不会产生依赖
ifeq ("${wildcard ${DIR_DEPS}}","")
    DEP_DIR_DEPS:=${DIR_DEPS}
endif	
注意ifeq后面有个空格才好使,不然会报错


ifeq ("${wildcard ${DIR_O}}", "")
    DEP_DIR_O:=${DIR_O}
endif


ifneq (${MAKECMDGOALS},clean)
	-include ${DEPS}
endif
${EXE}:${DIR_EXE} ${O_DESTINATION}
	${CC} ${INC_DIR} -o $@ ${filter %.o,$^}
o/%.o:obj/%.c ${DEP_DIR_O}
	${CC} ${INC_DIR} -o $@ -c ${filter %.c,$^}
${DIR_DEPS}/%.dep:obj/%.c ${DEP_DIR_DEPS}
	${CC} ${INC_DIR} -MM ${filter %.c,$^}>$@.tmp;\
	sed 's,\(.*\)\.o:,o/\1.o $@:,g'<$@.tmp>$@;\
	${RM} -rf $@.tmp
	

${DIR}:
	${MKDIR} $@


clean:
	${RM} -rf ${DIR}
	

问题2,每次make完之后,仍然make,理论上不应该在出现编译的情况,但还是编译。
在这里插入图片描述
查看文件的时间
在这里插入图片描述
后面感觉跟第一个问题是一样的,于是把可生成文件的生成也改为与第一个问题相同的解决方法。

ifeq ("${wildcard ${DIR_O}}", "")
    DEP_DIR_O:=${DIR_O}
endif
也是判断文件是否存在,不存在建立依赖,存在则不建立。

解决。

发布了24 篇原创文章 · 获赞 3 · 访问量 930

猜你喜欢

转载自blog.csdn.net/HIT_zhanmusi/article/details/104475249