简易makefile笔记

目的:使用一个makefile,实现多源文件夹和多库文件夹的编译。

目录结构:test.c作为main函数所在文件,内部引用了test_a,test_b,test_c的函数和一个lib库。

方案1缺点,每次make所有文件都会重新编译。

原因:${TARGET_OUT}:$(notdir ${OBJECT}) ${LIB_OUT}。最终文件生成依赖$(notdir ${OBJECT}),会在根路径下寻找o文件,但是所有o文件都存在于out/obj下,找不到后就会重新生成依赖项

CC:=gcc
AR:=ar

BASE_DIR=${shell pwd}
BIN_DIR=${BASE_DIR}/out/bin
OBJ_DIR=${BASE_DIR}/out/obj
LIB_DIR=${BASE_DIR}/out/lib
SRC_DIR=${BASE_DIR}

LIB_NAME=lib_test.a
LIB_INCLUDE_LIST=-I${BASE_DIR}/lib/include
LIB_SRC_LIST=${BASE_DIR}/lib/src
LIB_OUT=${LIB_DIR}/${LIB_NAME}

INCLUDE_LIST+=-I${BASE_DIR}/a/include
INCLUDE_LIST+=-I${BASE_DIR}/b/include
INCLUDE_LIST+=-I${BASE_DIR}/c/include

SRC_LIST+=${BASE_DIR}
SRC_LIST+=${BASE_DIR}/a/src
SRC_LIST+=${BASE_DIR}/b/src
SRC_LIST+=${BASE_DIR}/c/src

VPATH+=${SRC_LIST}
VPATH+=${LIB_SRC_LIST}

CFLAGS+=-g 
CFLAGS+=${INCLUDE_LIST}
CFLAGS+=${LIB_INCLUDE_LIST}
CFLAGS+=-L${LIB_DIR}


TARGET=test_out
TARGET_OUT=${BIN_DIR}/${TARGET}

SOURCE=$(foreach src_list_temp,${SRC_LIST},${shell find ${src_list_temp} -maxdepth 1 -name "*.c"})
OBJECT=$(foreach src_temp,${SOURCE},$(subst ${SRC_DIR},${OBJ_DIR},$(patsubst %.c,%.o,${src_temp})))

LIB_SOURCE=$(foreach lib_src_list_temp,${LIB_SRC_LIST},${shell find ${lib_src_list_temp} -maxdepth 1 -name "*.c"})
LIB_OBJECT=$(foreach lib_src_temp,${LIB_SOURCE},$(subst ${SRC_DIR},${OBJ_DIR},$(patsubst %.c,%.o,${lib_src_temp})))


${TARGET_OUT}:$(notdir ${OBJECT}) ${LIB_OUT}
	@mkdir -p ${BIN_DIR}
	${CC} -o $@ $(foreach temp,$(filter %.o,$^),${shell find ${OBJ_DIR} -name ${temp}}) ${LIB_OUT}

%.o:%.c
	@mkdir -p ${OBJ_DIR}$(subst ${SRC_DIR},,$(subst .,,$(dir $^))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值