makefile基本模板

编译时一直以来都是用eclispe自带的自动编译,由于需要对其他开源代码的makefile做一些修改,所以最近学了一下,其实还挺简单的,一些基本概念就不讲了,网上教程很多,下面来举一个基本的例子来记录一下makefile的基本用法。

首先文件目录如下,编译的.o文件都放在Obj目录下
在这里插入图片描述
然后编译时还需要一个库文件libreadline.dll.a,库所在目录为/mingw32/lib ,对应的头文件目录为/mingw32/include ,makefile编写如下,注意所有执行命令开始都要用tab键,这里由于排版问题带@的行显示不了tab键

ADD_DIR = add
SUB_DIR = sub
OBJ_DIR = ../Obj

INC_DIR = -I${ADD_DIR} \
          -I${SUB_DIR} \
          -I/mingw32/include 
          
# 调用libreadline.dll或libreadline.a
LFLAGS = -lreadline
# 库所在的目录,前面加-L
LDDIR = -L/mingw32/lib 
     
# 获取所以源文件     
SRC = ${wildcard  ${ADD_DIR}/*.c} \
      ${wildcard  ${SUB_DIR}/*.c} \
      main.c
# 把.c后缀替换为.o,并加上目录        
OBJ = ${patsubst %.c, ${OBJ_DIR}/%.o, ${notdir ${SRC}}}

TARGET=main
CC=cc
CCFLAGS=-g -Wall ${INC_DIR} 

# ${OBJ}代表	../Obj/add.o,../Obj/sub.o,../Obj/main.o
${TARGET}: ${OBJ}
# 命令一定要用tab键
    # $^代表冒号后的标识符,即${OBJ}
    # ${LDDIR} ${LFLAGS} 一定要放后面,否则链接不到动态库
	${CC}  $^ ${LDDIR} ${LFLAGS}  -o $@
	@echo "Compile done."
    
${OBJ_DIR}/%.o:${ADD_DIR}/%.c
    # 如果目录不存在新建一个
	if [ ! -d $(OBJ_DIR) ]; then mkdir -p $(OBJ_DIR); fi;
	@echo "Compiling $< ==> $@"
	${CC} ${CCFLAGS} -c $< -o $@
	
${OBJ_DIR}/%.o:${SUB_DIR}/%.c
	@echo "Compiling $< ==> $@"
	${CC} ${CCFLAGS} -c $< -o $@
	
${OBJ_DIR}/%.o:%.c
	@echo "Compiling $< ==> $@"
	${CC} ${CCFLAGS} -c $< -o $@
    
clean:
# -r删除目录,-f删除文件
	@rm -r ${OBJ_DIR}
	@echo "Clean object files done."

	@rm -f ${TARGET}
	@echo "Clean target files done."

猜你喜欢

转载自blog.csdn.net/pfysw/article/details/98469269