标签:
花了一个早上,看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)
标签:
原文地址:http://www.cnblogs.com/xiaole10368/p/5384453.html