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

花了一个早上,看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 [email protected] $^ $(COUT)

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

$(OBJPATH)/%.o : $(SRCDIR2)/%.c
 mkdir -p $(OBJPATH)
 mkdir -p $(TARDIR)
 $(CC) -c $< $(CFLAGS) -o [email protected] $(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 [email protected] $(COUT)

$(OBJ_DIR)/%.o : $(SRC_DIR2)/%.$(EXTENSION)
 mkdir -p $(OBJ_DIR)
 mkdir -p $(TAR_DIR)
 $(CC) -c $< $(CFLAGS) -o [email protected] $(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)
时间: 2024-08-07 05:11:14

【原创】MakeFile学习成果之模板的相关文章

OpenCV 学习笔记(模板匹配)

OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够高时,就认为找到了我们的目标. 在 OpenCV 中,提供了相应的函数完成这个操作. matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像 minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置 在具体介绍这两个函数之前呢,我们还要介绍一个概念,就是如何来评价两

C++ Primer 学习笔记_77_模板与泛型编程 --实例化

模板与泛型编程 --实例化 引言: 模板是一个蓝图,它本身不是类或函数.编译器使用模板产生指定的类或函数的特定版本号.产生模板的特定类型实例的过程称为实例化. 模板在使用时将进行实例化,类模板在引用实际模板类型时实例化,函数模板在调用它或用它对函数指针进行初始化或赋值时实例化. 1.类的实例化 当编写Queue<int>qi时,编译器自己主动创建名为Queue<int>的类.实际上,编译器通过又一次编写Queue模板,用类型int取代模板形參的每次出现而创建Queue<int

【Linux学习】Makefile学习(二)

FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 40975    Accepted Submission(s): 13563 Problem Description FatMouse prepared M pounds of cat food, ready to trade with the cats g

C++ Primer 学习笔记_81_模板与泛型编程 --类模板成员[续1]

模板与泛型编程 --类模板成员[续1] 二.非类型形参的模板实参 template <int hi,int wid> class Screen { public: Screen():screen(hi * wid,'#'), cursor(hi * wid),height(hi),width(wid) {} //.. private: std::string screen; std::string::size_type cursor; std::string::size_type height

C++ Primer 学习笔记_82_模板与泛型编程 --类模板成员[续2]

模板与泛型编程 --类模板成员[续2] 六.完整的Queue类 Queue的完整定义: template <typename Type> class Queue; template <typename Type> ostream &operator<<(ostream &,const Queue<Type> &); template <typename Type> class QueueItem { friend clas

MakeFile 学习

MakeFile 学习 1.静态模式 objects = foo.o bar.o all: $(objects) $(CC) $(CFLAGS) -o -o [email protected] $^ $(objects): %.o: %.c $(CC) -c $(CFLAGS) $< -o [email protected] 上面的例子中,指明了我们的目标从$object中获取,"%.o"表明要所有以".o"结尾的目标,也就是"foo.o bar.o

C++ Primer 学习笔记_75_模板与泛型编程 --模板定义

模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模板的定义. 泛型编程与面向对象编程一样,都依赖于某种形式的多态性.面向对象编程中的多态性在执行时应用于存在继承关系的类.我们能够编写使用这些类的代码,忽略基类与派生类之间类型上的差异.仅仅要使用基类的引用或指针,基类类型或派生类类型的对象就能够使用同样的代码. 在泛型编程中,我们所编写的类和函数能够

C++ Primer 学习笔记_84_模板与泛型编程 --模板特化

模板与泛型编程 --模板特化 引言: 我们并不总是能够写出对全部可能被实例化的类型都最合适的模板.某些情况下,通用模板定义对于某个类型可能是全然错误的,通用模板定义或许不能编译或者做错误的事情;另外一些情况下,能够利用关于类型的一些特殊知识,编写比从模板实例化来的函数更有效率的函数. compare函数和 Queue类都是这一问题的好样例:与C风格字符串一起使用进,它们都不能正确工作. compare函数模板: template <typename Type> int compare(cons

C++ Primer 学习笔记_83_模板与泛型编程 --一个泛型句柄类

模板与泛型编程 --一个泛型句柄类 引言: [小心地雷] 这个例子体现了C++相当复杂的语言应用,理解它需要很好地理解继承和模板.在熟悉了这些特性之后再研究这个例子也许会帮助.另一方面,这个例子还能很好地测试你对这些特性的理解程度. 前面示例的Sales_item和Query两个类的使用计数的实现是相同的.这类问题非常适合于泛型编程:可以定义类模板管理指针和进行使用计数.原本不相关的Sales_item类型和 Query类型,可通过使用该模板进行公共的使用计数工作而得以简化.至于是公开还是隐藏下