编译时一直以来都是用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."