通用的makefile文件

#Author:zeno.chen
#Date:2015.03.21
CC=arm-linux-gcc                                              #使用的编译器定义
CXX=arm-linux-g++
AR=arm-linux-ar
 
APPNAME=name#这里填写编译的可执行程序的名称
ROOTDIR=$(shell pwd)#获取当前路径
OBJDIR=${ROOTDIR}/build#填写生成目标文件的目录
 
DIRS=$(shell find . -type d)#获取所有子目录
C_SRCS=$(foreach file,$(DIRS),$(wildcard $(file)/*.c))       #需要编译的c文件
CPP_SRCS=$(foreach file,$(DIRS),$(wildcard $(file)/*.cpp))   #需要编译的cpp文件
 
#目标文件定义,包括c文件和cpp文件相应的目标文件
OBJS:=$(patsubst %.cpp,%.o,$(CPP_SRCS)) 
OBJS+=$(patsubst %.c,%.o,$(C_SRCS)) 
#依赖文件定义,对每一个c文件和cpp文件都生成对应的依赖文件
DEPS:=$(patsubst %.c,%.d,${C_SRCS})
DEPS+=$(patsubst %.cpp,%.d,${CPP_SRCS})
 
#目标文件和依赖文件都放到OBJDIR目录下,保留源代码的目录结构
OBJFILES=$(addprefix ${OBJDIR}/,${OBJS})
DEPFILES=$(addprefix ${OBJDIR}/,${DEPS})
 
INC_DIRS=${DIRS}#填写头文件的路径
DEFINES=DEBUG#填写需要定义的宏名称
CXXFLAGS = $(addprefix -I,$(INC_DIRS)) $(addprefix -D,$(DEFINES))
EXTRA_CXXFLAGS= #其他编译选项
 
LIB_DIRS=libs#填写链接库所在目录
LIBS=m rt#填写需要链接的库名称,比如libm.so就填m
LDFLAGS=$(addprefix -L,$(LIB_DIRS)) $(addprefix -l,$(LIBS))
EXTRA_LDFLAGS=#其他链接选项
 
.PHONE: all clean dir
.SUFFIXES: .d 
all: dir $(APPNAME)
$(APPNAME): ${OBJFILES}
    ${CXX} -o $@ $^ ${LDFLAGS} $(EXTRA_LDFLAGS)
#按照源代码结构创建目标目录,为了防止重复创建目录使用以下方法
dir:
ifeq ($(wildcard ${OBJDIR}/exist),${OBJDIR}/exist)
    @echo "--------directorys have created----------"
else
    mkdir -p $(addprefix ${OBJDIR}/,${DIRS});touch ${OBJDIR}/exist
endif
#目标文件生成规则定义
${OBJDIR}/%.o:%.c  ${OBJDIR}/%.d
    ${CC} -o $@ -c $< ${CXXFLAGS} ${EXTRA_CXXFLAGS}
${OBJDIR}/%.o:%.cpp  ${OBJDIR}/%.d
    ${CXX} -o $@ -c $< ${CXXFLAGS} ${EXTRA_CXXFLAGS}
#依赖文件生成规则定义
${OBJDIR}/%.d:%.c
    ${CXX} -MM -MT $(patsubst %.d,%.o,$@) $< ${CXXFLAGS} ${EXTRA_CXXFLAGS}> $@
${OBJDIR}/%.d:%.cpp
    ${CXX} -MM -MT $(patsubst %.d,%.o,$@) $< ${CXXFLAGS} ${EXTRA_CXXFLAGS}> $@
-include ${DEPSFILES}#依赖文件规则包含,修改文件后只对有依赖的文件进行编译
clean:
    find ${OBJDIR} -name "*.o" -o -name "*.d" -o -name "${APPNAME}" |xargs rm ; rm -rf ${OBJDIR}; rm ${APPNAME}

关于Zeno Chen

本人涉及的领域较多,杂而不精 程序设计语言: Perl, Java, PHP, Python; 数据库系统: MySQL,Oracle; 偶尔做做电路板的开发,主攻STM32单片机
此条目发表在C/C++分类目录。将固定链接加入收藏夹。