多目录makefile,支持自动生成依赖关系,支持C和C++混合编译

博客作者更新了之前的makefile,以解决多目录项目中C和C++混合编译的问题,增加了忽略列表功能,并修复了自动依赖时的路径问题,确保模式规则与依赖信息匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的博客里,给出了一份makefile,但是在使用过程中发现一些问题,因此对其进行了更新,之前的文章地址如下,感兴趣的可以看看:

多目录makefile,支持自动生成依赖关系_makefile编译子目录依赖关系-优快云博客

更新的makefile,增加了一份忽略列表,可以将不想编译的文件加到里面,另外就是支持C和C++的混合编译。

更新:

2019.03.24 之前的版本自动依赖是有问题的,主要是由于如果依赖包含了路径,则对应的模式规则也需要包含路径,否则根据模式规则生成文件时,没有参考依赖信息。更新对该问题进行了修复,另外将部分变量名改为与make内建变量名一致。

DIR_SRC = ./src/
DIR_LIB = ./lib/
IGNORE_LIST = ./src/test.c
DIR_OBJ = ./debug/obj/
DIR_BIN = ./debug/bin/
TARGET = main.exe
# CROSS = arm-linux-
CROSS = 
CC = ${CROSS}gcc
CXX = ${CROSS}g++

LDLIBS :=
DIR_INC := ${DIR_LIB} ${DIR_SRC}
CFLAGS := -g -std=c99 -Wall ${foreach n,${DIR_INC},-I${n}}
CXXFLAGS := -g -Wall ${foreach n,${DIR_INC},-I${n}}
CPPFLAGS :=
LDFLAGS := ${foreach n,${DIR_LIB},-L${n}} ${LDLIBS}

empty =
space =${empty} ${empty}
VPATH := ${subst ${space},:,${DIR_SRC}}:${DIR_OBJ}:${DIR_BIN}
vpath %.c ${subst ${space},:,${DIR_SRC}}
vpath %.cpp ${subst ${space},:,${DIR_SRC}}
vpath %.o ${DIR_OBJ}
vpath %.d ${DIR_OBJ}

CSRC_WITH_PATH := ${foreach n,${DIR_SRC},${wildcard ${n}*.c}}
CSRC_WITH_PATH := ${filter-out ${IGNORE_LIST},${CSRC_WITH_PATH}}
CSRC := ${notdir ${CSRC_WITH_PATH}}
COBJ_WITH_PATH := ${patsubst %.c,${DIR_OBJ}%.o,${CSRC}}
COBJ := ${notdir ${COBJ_WITH_PATH}}
CDEF_WITH_PATH = ${COBJ_WITH_PATH:.o=.d}
CDEF = ${COBJ:.o=.d}

CXXSRC_WITH_PATH := ${foreach n,${DIR_SRC},${wildcard ${n}*.cpp}}
CXXSRC_WITH_PATH := ${filter-out ${IGNORE_LIST},${CXXSRC_WITH_PATH}}
CXXSRC := ${notdir ${CXXSRC_WITH_PATH}}
CXXOBJ_WITH_PATH := ${patsubst %.cpp,${DIR_OBJ}%.o,${CXXSRC}}
CXXOBJ := ${notdir ${CXXOBJ_WITH_PATH}}
CXXDEF_WITH_PATH = ${CXXOBJ_WITH_PATH:.o=.d}
CXXDEF = ${CXXOBJ:.o=.d}

TARGET_WITH_PATH := ${DIR_BIN}${TARGET}

DIR_OBJ ?= ./debug/
TARGET_WITH_PATH ?= ./debug/bin/main.exe

.PHONY:all
all:${TARGET}

${TARGET}:${COBJ_WITH_PATH} ${CXXOBJ_WITH_PATH}
ifneq (${empty},${findstring .cpp,${CXXSRC}})
	${CXX} $^ -o ${DIR_BIN}$@ ${LDFLAGS}
else
	${CC} $^ -o ${DIR_BIN}$@ ${LDFLAGS}
endif

${COBJ_WITH_PATH}:${DIR_OBJ}%.o:%.c
	${CC} ${CFLAGS} -c -o $@ $<
${CXXOBJ_WITH_PATH}:${DIR_OBJ}%.o:%.cpp
	${CXX} ${CXXFLAGS} -c -o $@ $<
${CDEF_WITH_PATH}:${DIR_OBJ}%.d:%.c
	${CC} ${CFLAGS} -MM -MT "${subst .d,.o,$@} $@" -MF "$@" $<
${CXXDEF_WITH_PATH}:${DIR_OBJ}%.d:%.cpp
	${CXX} ${CXXFLAGS} -MM -MT "${subst .d,.o,$@} $@" -MF "$@" $<

ifneq (${MAKECMDGOALS},clean)
-include ${CDEF_WITH_PATH} ${CXXDEF_WITH_PATH}
endif

run:${TARGET}
	${TARGET_WITH_PATH}

debug:${TARGET}
	gdb ${TARGET_WITH_PATH}

.PHONY:check
check:
	@echo VPATH : ${VPATH}
	@echo CSRC_WITH_PATH : ${CSRC_WITH_PATH}
	@echo CSRC : ${CSRC}
	@echo COBJ_WITH_PATH : ${COBJ_WITH_PATH}
	@echo COBJ : ${COBJ}
	@echo CDEF : ${CDEF}
	@echo CXXSRC_WITH_PATH : ${CXXSRC_WITH_PATH}
	@echo CXXSRC : ${CXXSRC}
	@echo CXXOBJ_WITH_PATH : ${CXXOBJ_WITH_PATH}
	@echo CXXOBJ : ${CXXOBJ}
	@echo CXXDEF : ${CXXDEF}

.PHONY:clean
clean:
#	-rm -f ${DIR_OBJ}*.o
#	-rm -f ${DIR_OBJ}*.d
#	-rm -f ${TARGET_WITH_PATH}
	-cd ${DIR_OBJ} && del *.o *.d
	-cd ${DIR_BIN} && del ${TARGET}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值