码迷,mamicode.com
首页 > 其他好文 > 详细

【原创】MakeFile学习成果之模板

时间:2016-04-12 22:25:46      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:

花了一个早上,看MakeFile的文档。参考例子,自己写了一个相对通用的MakeFile模板。特放上来,以防丢失。刚学习MakeFile的朋友可以参考看看,高手就当路过了!!

 

先看目录结构!!

ls -R

/************************************************
.:
cc.lst exe/  inc/  inc2/  Makefile  obj/  src/  src2/

./exe:
ftptest*

./inc:
ftplib.h

./inc2:
qftp.h

./obj:
ftplib.o  qftp.o

./src:
ftplib.c

./src2:
qftp.c

*******************************/


对应MakeFile如下

 

#相关宏
CC= gcc
LD= ld
AS= as
AR= ar
NM= nm
OBJCOPY = objcopy
OBJDUMP = objdump
RM=rm -rf

#生成执行文件路径
TARDIR = $(shell pwd)/exe
#执行文件名字
TARGET = ftptest
#源码路径
SRCDIR = $(shell pwd)/src
SRCDIR2 = $(shell pwd)/src2
#头文件路径
INCPATH   := -I $(shell pwd)/inc -I $(shell pwd)/inc2
#库路径和库名
LIBPATH   := -L $(shell pwd)/lib -pthread
#编译输出
COUT      := >> cc.lst 2>&1


#gcc编译选项
CFLAGS      := -g -Wall -DLINUX_ENV
CFLAGS      +=$(INCPATH)
CFLAGS      +=$(LIBPATH)


RTPDIR  := $(shell pwd)/m61850/src

#中间文件路径
OBJPATH   :=$(shell pwd)/obj


OBJECTS =     $(OBJPATH)/ftplib.o    $(OBJPATH)/qftp.o


all:$(TARDIR)/$(TARGET)

#相关变量显示
 echo "FINISHED GENERATING $(TARGET) EXECUTABLE" $(COUT)
 echo "-----------------------------------------------------" $(COUT)

#总
$(TARDIR)/$(TARGET) : $(OBJECTS)
 $(CC) -o $(TARDIR)/$(TARGET) $(CFLAGS) $(OBJECTS)  $(COUT)

#$(TARDIR)/$(TARGET) : $(OBJECTS)
# $(CC) -o $@ $^ $(COUT)

#分,如果有子目录,一定要带路径
$(OBJPATH)/%.o : $(SRCDIR)/%.c
 mkdir -p $(OBJPATH)
 mkdir -p $(TARDIR)
 $(CC) -c $< $(CFLAGS) -o $@ $(COUT)

$(OBJPATH)/%.o : $(SRCDIR2)/%.c
 mkdir -p $(OBJPATH)
 mkdir -p $(TARDIR)
 $(CC) -c $< $(CFLAGS) -o $@ $(COUT)

clean:
 $(RM) cc.lst
 $(RM) $(OBJPATH)
 $(RM) $(TARDIR)/$(TARGET)
 $(RM) *.bin *.elf *.dis *.map
 find . \( -name *.o -o -name *.a \) -type f -print | xargs $(RM)

 

 

 

 

更新版V1.1

###################使用说明#################################
#只需要更改CC TARGET TAR_DIR SRC_DIR INC_DIR LIB_DIR OBJ_DIR


###################编译器###################################
CC= gcc
LD= ld
AS= as
AR= ar
NM= nm
OBJCOPY = objcopy
OBJDUMP = objdump
RM=rm -rf

###################相关路径###################################
#TARGET       执行文件名字
#LOCAL_DIR     当前路径
#TAR_DIR       生成的可执行文件路径
#SRC_DIR       源码路径,可有多个
#INC_DIR       头文件路径,可有多个
#LIB_DIR       库路径,可有多个
#OBJ_DIR       中间文件路径

TARGET     = test
LOCAL_DIR  = $(shell pwd)
TAR_DIR    = $(LOCAL_DIR)/bin
SRC_DIR    = $(LOCAL_DIR)/src
SRC_DIR2   = $(LOCAL_DIR)/src2
INC_DIR    = $(LOCAL_DIR)/inc
INC_DIR2   = $(LOCAL_DIR)/inc2
LIB_DIR    = $(LOCAL_DIR)/lib
LIBDIR2    = $(LOCAL_DIR)/lib2
OBJ_DIR    =$(LOCAL_DIR)/obj
PROGRAM   =$(TAR_DIR)/$(TARGET)

####################编译输出###################################
#COUT      = >> cc.lst 2>&1

###################include头文件路径###########################
INCPATH   = -I $(INC_DIR) -I $(INC_DIR2)

###################lib文件及路径###############################
LIBPATH   = -L $(LIB_DIR) -L $(LIBDIR2) -pthread

###################编译选项及编译器############################

CFLAGS      := -g -Wall -DLINUX_ENV
CFLAGS      +=$(INCPATH)
CFLAGS      +=$(LIBPATH)

###################OBJ文件及路径################################
#EXTENSION   C后缀 CPP后缀
#wildcard 是GNU make程序预定义的一个函数,作用便是获取匹配模式文件名
#模式替换函数patsubst函数原型为$(patsubst PATTERN,REPLACEMENT,TEXT)
#三个参数依次代表了匹配模式,替换规则,替换目标字符串
#SRCDIRS  所有源文件名集合
#foreach 相当于for
SRCDIRS=${SRC_DIR} ${SRC_DIR2} 
EXTENSION=c
SRC=$(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.$(EXTENSION)))
OBJECTS=$(patsubst %.$(EXTENSION), ${OBJ_DIR}/%.o, $(notdir ${SRC}))

 

###################编译目标######################################
#相关变量显示
all:$(PROGRAM)
 echo "FINISHED GENERATING $(TARGET) EXECUTABLE" $(COUT)
 echo "-----------------------------------------------------" $(COUT)

#总
$(PROGRAM): $(OBJECTS)
 $(CC) -o $(PROGRAM) $(CFLAGS) $(OBJECTS)  $(COUT)


#分,如果有子目录,一定要带路径
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.$(EXTENSION)
 mkdir -p $(OBJ_DIR)
 mkdir -p $(TAR_DIR)
 $(CC) -c $< $(CFLAGS) -o $@ $(COUT)

$(OBJ_DIR)/%.o : $(SRC_DIR2)/%.$(EXTENSION)
 mkdir -p $(OBJ_DIR)
 mkdir -p $(TAR_DIR)
 $(CC) -c $< $(CFLAGS) -o $@ $(COUT)
 
 
.PHONY:clean
clean:
clean:
 $(RM) cc.lst
 $(RM) $(OBJ_DIR)
 $(RM) $(PROGRAM)
 $(RM) *.bin *.elf *.dis *.map
 find . \( -name ‘*.o‘ -o -name ‘*.a‘ \) -type f -print | xargs $(RM)

 

【原创】MakeFile学习成果之模板

标签:

原文地址:http://www.cnblogs.com/xiaole10368/p/5384453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!