通用Makefile模板及实例

合集下载

Makefile文件语法

Makefile文件语法

Makefile⽂件语法概述本⽂将介绍Makefile种注释、回显、通配符、变量、循环判断、函数注释Makefile中只有单⾏注释,没有多⾏注释,注释以 # 开头。

以下Makefile注释⽚段节选⾃的Makefile# Makefile for installing Lua# See doc/readme.html for installation and customization instructions.# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================# Your platform. See PLATS for possible values.PLAT= noneechoing(回显)通常,make在执⾏命令⾏之前会把要执⾏的命令⾏进⾏输出。

我们称之为“回显”,就好像我们输⼊命令执⾏⼀样。

@如果要执⾏的命令⾏以字符“@”开始,则make在执⾏时这个命令就不会被回显。

典型的⽤法是我们在使⽤“echo”命令输出⼀些信息时。

如:@echo 开始编译XXX模块......当make执⾏时,将输出“开始编译XXX模块......”这个信息。

如果在命令⾏之前没有字符“@”,那么,make的输出就是:echo编译XXX模块......编译XXX模块......“-n”或“--just-print”如果使⽤make的命令⾏参数“-n”或“--just-print”,那么make执⾏时只显⽰所要执⾏的命令,但不会真正的去执⾏这些命令。

只有在这种情况下make才会打印出所有make需要执⾏的命令,其中也包括了使⽤“@”字符开始的命令。

这个选项对于我们调试Makefile⾮常有⽤,使⽤这个选项我们可以按执⾏顺序打印出Makefile中所有需要执⾏的命令。

“-s”或“--slient”make参数“-s”或“--slient”则是禁⽌所有执⾏命令的显⽰,就好像所有的命令⾏均使⽤“@”开始⼀样。

GNU MakeFile 使用手册

GNU MakeFile 使用手册

GNU Make 使用手册(中译版)翻译:于凤昌译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构、理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件。

目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的Makefile文件,因此本人认真阅读了GNU Make 使用手册(3.79)版原文,在此基础上翻译了该手册,以满足对Linux源代码有兴趣或者希望采用GCC编写程序但对缺乏GNU Make全面了解之人士的需要。

本人是业余爱好不是专业翻译人士,如果有问题请通过电子信箱与我联系共同商讨,本人的E-mail为:yfc70@。

注意在文章中出现的斜体加粗字表示章节。

GNU make Version 3.79April 2000Richard M. Stallman and Roland McGrath目录GNU Make 使用手册(中译版) (1)GNU make Version 3.79 (1)April 2000 (1)目录 (1)1 Make 概述 (4)1.1怎样阅读本手册 (4)1.2问题和BUG (4)2 Makefile文件介绍 (5)2.1 规则的格式 (5)2.2一个简单的Makefile文件 (5)2.3 make处理makefile文件的过程 (6)2.4使用变量简化makefile文件 (6)2.5 让make推断命令 (7)2.6 另一种风格的makefile文件 (7)2.7 在目录中删除文件的规则 (7)3 编写makefile文件 (8)3.1 makefile文件的内容 (8)3.2 makfile文件的命名 (8)3.3 包含其它的makefile文件 (8)3.4 变量MAKEFILES (9)3.5 makefile文件重新生成的过程 (9)3.6 重载其它makefile文件 (10)3.7 make读取makefile文件的过程 (10)4编写规则 (11)4.1规则的语法 (11)4.2 在文件名中使用通配符 (11)4.2.1通配符例子 (11)4.2.2使用通配符的常见错误 (12)4.2.3函数wildcard (12)4.3在目录中搜寻依赖 (12)4.3.1 VPATH:所有依赖的搜寻路径 (12)4.3.2 vpath指令 (13)4.3.3目录搜寻过程 (13)4.3.4编写目录搜寻的shell命令 (14)4.3.5 目录搜寻和隐含规则 (14)4.3.6 连接库的搜寻目录 (14)4.4假想目标 (14)4.5 没有命令或依赖的规则 (15)4.6使用空目标文件记录事件 (16)4.7 内建的特殊目标名 (16)4.8 具有多个目标的规则 (17)4.9 具有多条规则的目标 (17)4.10 静态格式规则 (17)4.10.1 静态格式规则的语法 (18)4.10.2静态格式规则和隐含规则 (18)4.11双冒号规则 (18)4.12 自动生成依赖 (19)5在规则中使用命令 (19)5.1 命令回显 (20)5.2执行命令 (20)5.3 并行执行 (20)5.4命令错误 (21)5.5中断或关闭make (21)5.6递归调用make (22)5.6.1 变量MAKE的工作方式 (22)5.6.2与子make通讯的变量 (22)5.6.3与子make通讯的选项 (23)5.6.4 ‘--print-directory’选项 (24)5.7定义固定次序命令 (24)5.8 使用空命令 (25)6 使用变量 (25)6.1 变量引用基础 (25)6.2 变量的两个特色 (25)6.3变量引用高级技术 (27)6.3.1替换引用 (27)6.3.2嵌套变量引用(计算的变量名) (27)6.4变量取值 (28)6.5设置变量 (29)6.6 为变量值追加文本 (29)6.7 override指令 (30)6.8定义多行变量 (30)6.9 环境变量 (31)6.10 特定目标变量的值 (31)6.11 特定格式变量的值 (31)7 makefile文件的条件语句 (32)7.1条件语句的例子 (32)7.2条件语句的语法 (32)7.3测试标志的条件语句 (33)8 文本转换函数 (34)8.1函数调用语法 (34)8.2字符串替换和分析函数 (34)8.3文件名函数 (35)8.4函数foreach (36)8.5函数if (37)8.6函数call (37)8.7函数origin (38)8.8 函数shell (38)8.9 控制make的函数 (39)9 运行make (39)9.1 指定makefile文件的参数 (39)9.2指定最终目标的参数 (39)9.3 代替执行命令 (40)9.4避免重新编译文件 (41)9.5变量重载 (41)9.6 测试编译程序 (42)9.7 选项概要 (42)10 使用隐含规则 (44)10.1 使用隐含规则 (44)10.2隐含规则目录 (44)10.3隐含规则使用的变量 (46)10.4 隐含规则链 (47)10.5定义与重新定义格式规则 (48)10.5.1格式规则简介 (48)10.5.2格式规则的例子 (48)10.5.3自动变量 (49)10.5.4格式匹配 (50)10.5.5万用规则 (50)10.5.6删除隐含规则 (50)10.6 定义最新类型的缺省规则 (51)10.7 过时的后缀规则 (51)10.8隐含规则搜寻算法 (52)11使用make更新档案文件 (52)11.1档案成员目标 (53)11.2 档案成员目标的隐含规则 (53)11.2.1更新档案的符号索引表 (54)11.3 使用档案的危险 (54)11.4 档案文件的后缀规则 (54)12 GNU make的特点 (54)13 不兼容性和失去的特点 (56)14 makefile文件惯例 (56)14.1 makefile文件的通用惯例 (56)14.2 makefile文件的工具 (57)14.3 指定命令的变量 (57)14.4安装路径变量 (58)14.5用户标准目标 (60)14.6 安装命令分类 (62)15 快速参考 (63)16 make产生的错误 (66)17 复杂的makfile文件例子 (67)脚注 (70)(1) (70)(2) (70)(3) (70)名词翻译对照表 (71)1 Make 概述Make 可自动决定一个大程序中哪些文件需要重新编译,并发布重新编译它们的命令。

整理后的makefile中文手册

整理后的makefile中文手册

GNU make中文手册ver - 3.8翻译整理:徐海兵2004-09-11关于本书本文瑾献给所有热爱Linux的程序员!本中文文档版权所有。

本文比较完整的讲述GNU make工具,涵盖GNU make的用法、语法。

同时重点讨论如何为一个工程编写Makefile。

作为一个Linux程序员,make工具的使用以及编写Makefile是必需的。

系统、详细讲述make的中文资料比较少,出于对广大中文Linuxer 的支持,本人在工作之余,花了18个多月时间完成对‚info make‛的翻译整理,完成这个中文版手册。

本书不是一个纯粹的语言翻译版本,其中对GNU make的一些语法和用法根据我个人的工作经验进行了一些详细分析和说明,也加入了一些个人的观点和实践总结。

本书的所有的例子都可以在支持V3.8版本的GNU make的系统中正确执行。

由于个人水平限制,本文在一些地方存在描述不准确之处。

恳请大家在阅读过程中,提出您宝贵的意见,也是对我个人的帮助。

我的个人电子邮箱地址:xhbdahai@。

非常愿意和大家交流!共同学习。

阅读本书之前,读者应该对GNU的工具链和Linux的一些常用编程工具有一定的了解。

诸如:gcc、as、ar、ld、yacc等;同时在书写Makefile时,需要能够进行一些基本的shell编程。

这些工具是维护一个工程的基础。

如果大家对这些工具的用法不是很熟悉,可参考项目资料。

阅读本文的几点建议:1.如果之前你对GNU make没有了解、当前也不想深入的学习GNU make的读者。

可只阅读本文各章节前半部分的内容(作为各章节的基础知识)。

2.如果你已经对GNU make比较熟悉,你更需要关心此版本的新增特点、功能、和之前版本不兼容之处;也可以作为开发过程过程的参考手册。

3.之前你对GNU make没有概念、或者刚开始接触,本身又想成为一个Linux下的专业程序员,那么建议:完整学习本文的各个章节,包括了基础知识和高级用法、技巧。

makefile引用标准c函数

makefile引用标准c函数

一、概述在软件开发过程中,为了提高代码的可维护性和可移植性,通常会使用Makefile来管理代码的编译和信息过程。

而在C语言的开发中,经常会用到标准C库中的各种函数。

本文将讨论如何在Makefile中引用标准C函数,以及一些注意事项和最佳实践。

二、Makefile中的规则Makefile是用来描述软件项目中文件之间的依赖关系的文件。

它包含了一系列规则,每个规则包含了一个目标文件、依赖文件和生成目标文件的命令。

当执行make命令时,Makefile会根据规则自动执行对应的命令,从而生成目标文件。

三、引用标准C函数1. 在Makefile中引用标准C函数需要首先确保C标准库的头文件被正确包含。

在C语言中,通过#include指令可以将标准C库的头文件包含到源文件中。

2. 在Makefile中,我们可以使用变量来定义编译器、编译选项和信息选项。

我们可以定义CC变量来指定C语言的编译器,CFLAGS变量来指定编译选项,LDFLAGS变量来指定信息选项。

3. 当我们需要在Makefile中引用标准C函数时,我们只需要在对应的规则中使用变量来指定编译选项和信息选项。

如果我们需要使用标准C函数printf,我们只需要在对应的规则中将需要用到的标准库信息到目标文件中。

四、注意事项和最佳实践1. 在Makefile中引用标准C函数时,我们需要确保编译时能找到对应的标准C库文件。

通常情况下,标准C库文件会在系统的标准库目录下,我们需要将这些目录添加到信息选项中。

2. 在Makefile中引用标准C函数时,我们需要确保编译器能找到对应的标准C库头文件,通常情况下,标准C库头文件会在系统的标准头文件目录下,我们需要将这些目录添加到编译选项中。

3. 在Makefile中引用标准C函数时,我们需要确保编译器能正确识别和处理对应的标准C函数的参数和返回值类型。

通常情况下,标准C函数的参数和返回值类型会在对应的头文件中定义,我们需要确保这些定义被正确包含到源文件中。

大型工程多个目录下的Makefile写法

大型工程多个目录下的Makefile写法

⼤型⼯程多个⽬录下的Makefile写法1、前⾔2、简单测试 测试程序在同⼀个⽂件中,共有func.h、func.c、main.c三个⽂件,Makefile写法如下所⽰:1 CC = gcc2 CFLAGS = -g -Wall34 main:main.o func.o5 $(CC) main.o func.o -o main6 main.o:main.c7 $(CC) $(CFLAGS) -c main.c -o main.o8 func.o:func.c9 $(CC) $(CFLAGS) -c func.c -o func.o10 clean:11 rm -rf *.o执⾏过程如下图所⽰:3、通⽤模板 实际当中程序⽂件⽐较⼤,这时候对⽂件进⾏分类,分为头⽂件、源⽂件、⽬标⽂件、可执⾏⽂件。

也就是说通常将⽂件按照⽂件类型放在不同的⽬录当中,这个时候的Makefile需要统⼀管理这些⽂件,将⽣产的⽬标⽂件放在⽬标⽬录下,可执⾏⽂件放到可执⾏⽬录下。

测试程序如下图所⽰:完整的Makefile如下所⽰:1 DIR_INC = ./include2 DIR_SRC = ./src3 DIR_OBJ = ./obj4 DIR_BIN = ./bin56 SRC = $(wildcard ${DIR_SRC}/*.c)7 OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC}))89 TARGET = main1011 BIN_TARGET = ${DIR_BIN}/${TARGET}1213 CC = gcc14 CFLAGS = -g -Wall -I${DIR_INC}1516 ${BIN_TARGET}:${OBJ}17 $(CC) $(OBJ) -o $@1819 ${DIR_OBJ}/%.o:${DIR_SRC}/%.c20 $(CC) $(CFLAGS) -c $< -o $@21 .PHONY:clean22 clean:23 find ${DIR_OBJ} -name *.o -exec rm -rf {}解释如下:(1)Makefile中的符号@, ^, < 的意思: @ 表⽰⽬标⽂件 ^ 表⽰所有的依赖⽂件 < 表⽰第⼀个依赖⽂件 $? 表⽰⽐⽬标还要新的依赖⽂件列表(2)wildcard、notdir、patsubst的意思: wildcard : 扩展通配符 notdir :去除路径 patsubst :替换通配符例如下图例⼦所⽰:输出结果如下所⽰:SRC = $(wildcard *.c)等于指定编译当前⽬录下所有.c⽂件,如果还有⼦⽬录,⽐如⼦⽬录为inc,则再增加⼀个wildcard函数,象这样:SRC = (wildcard *.c) (wildcard inc/*.c)(3)gcc -I -L -l的区别:gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld上⾯这句表⽰在编译hello.c时-I /home/hello/include表⽰将/home/hello/include⽬录作为第⼀个寻找头⽂件的⽬录, 寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include -L /home/hello/lib表⽰将/home/hello/lib⽬录作为第⼀个寻找库⽂件的⽬录, 寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib-lworld表⽰在上⾯的lib的路径中寻找libworld.so动态库⽂件(如果gcc编译选项中加⼊了“-static”表⽰寻找libworld.a静态库⽂件)参考:Processing math: 0%。

手把手教你如何写Makefile

手把手教你如何写Makefile

手把手教你如何写Makefile陈皓 2005.04.01一、Makefile的规则在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则。

target ... : prerequisites ...commandtarget也就是一个目标文件,可以是Object File,也可以是执行文件。

还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

prerequisites就是,要生成那个target所需要的文件或是目标。

command也就是make需要执行的命令。

(任意的Shell命令)这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites 中的文件,其生成规则定义在command中。

说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

这就是Makefile的规则。

也就是Makefile中最核心的内容。

说到底,Makefile的东西就是这样一点,好像我的这篇文档也该结束了。

呵呵。

还不尽然,这是Makefile的主线和核心,但要写好一个Makefile还不够,我会以后面一点一点地结合我的工作经验给你慢慢到来。

内容还多着呢。

:)二、一个示例正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。

edit : main.o kbd.o command.o display.o \insert.o search.o files.o utils.occ -o edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.omain.o : main.c defs.hcc -c main.ckbd.o : kbd.c defs.h command.hcc -c kbd.ccommand.o : command.c defs.h command.hcc -c command.cdisplay.o : display.c defs.h buffer.hcc -c display.cinsert.o : insert.c defs.h buffer.hcc -c insert.csearch.o : search.c defs.h buffer.hcc -c search.cfiles.o : files.c defs.h buffer.h command.hcc -c files.cutils.o : utils.c defs.hcc -c utils.cclean :rm edit main.o kbd.o command.o display.o \insert.o search.o files.o utils.o反斜杠(\)是换行符的意思。

“万能makefile”写法详解,一步一步写一个实用的Makefile

“万能makefile”写法详解,一步一步写一个实用的Makefile

“万能makefile”写法详解,一步一步写一个实用的Makefilehttps:///qq1452008/article/details/50865535? share_token=52d10253-88ef-4463-9727-2ebc94e23726&tt_from=copy_link&utm_source=copy_link&ut m_medium=toutiao_android&utm_campaign=client_share?=本文转载自:作者:胡彦 2013-5-21出处:/huyansoft/article/details/8924624 提示:本文在原博文的基础上做了一点点修改与完善,诸如原博文的后面有显示不全的地方,自己已完善!作者:胡彦 2013-5-21代码和文档下载地址:/share/link?shareid=616139&uk=2535441 82一目的:编写一个实用的makefile,能自动编译当前目录下所有.c/.cpp源文件,支持二者混合编译。

并且当某个.c/.cpp、.h或依赖的源文件被修改后,仅重编涉及到的源文件,未涉及的不编译。

二要达到这个目的,用到的技术有:1-使用wildcard函数来获得当前目录下所有.c/.cpp文件的列表。

2-make的多目标规则。

3-make的模式规则。

4-用gcc -MM命令得到一个.c/.cpp文件include了哪些文件。

(具体使用细节,请点击博文链接)5-用sed命令对gcc -MM命令的结果作修改。

6-用include命令包含依赖描述文件.d。

三准备知识(一)多目标对makefile里下面2行,可看出多目标特征,执行make bigoutput或make littleoutput可看到结果:bigoutput littleoutput: defs.h pub.h@echo $@ $(subst output,OUTPUT,$@) $^注释:$@指该规则目标集合中能引起该规则执行的目标,$^指这个规则里所有依赖的集合。

Makefile

Makefile

Makefile规则:target … : prerequisites…command……target就是一个目标文件,可以是Object File,也可以是可执行文件。

还可以是一个标签(Lable)。

prerequisites 就是要生成target所需要的文件或目标。

command 就是make需要执行的命令。

文件的依赖关系:target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。

如果prerequisites中的文件有一个以上的文件比target中的文件要新的话,则需要执行command定义的命令。

(Makefile规则)在Makefile中的反斜杠(\)表示换行的意思。

make命令解析Makefile文件。

如果要删除可执行文件和中间目标文件,只需要执行“make clean”。

edit : main.o kbd.o display.occ –o edit main.o kdb.o display.omain.o : main.c defs.hcc –c main.ckdb.o : kdb.c defs.hcc –c kdb.cdisplay.o : display.c defs.h command.hcc –c display.cclean:rm edit main.o kdb.o kdb.o在上个Makefile中,target(目标文件)包含:可执行文件edit和*.o(所有的中间目标文件)。

prerequisites(依赖文件)就是冒号后面的所有文件。

依赖关系:其实就是说明了目标文件是由哪些文件生成的,换言之,就是目标文件是哪些文件更新的。

make命令作用:比较target与prerequisites的日期,如果target日期比prerequisites新,不执行命令;否则(target日期不比prerequisites新或是target不存在),执行command命令,并更新或生成target。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 通用Makefile——1实现的功能:•make——编译和连接程序•make objs——编译程序,生成目标文件•make clean——清除编译产生的目标文件(*.o)和依赖文件(*.d)•make cleanall——清除目标文件(*.o)、依赖文件(*.d)和可执行文件(*.exe)•make rebuild——重新编译连接程序,相当于make clean && makeUsage:Makefile源代码# Gneric C/C++ Makefile####################################################PROGRAM :=SRCDIRS :=SRCEXTS :=CPPFLAGS :=CFLAGS :=CFLAGS +=CXXFLAGS :=CXXFLAGS +=LDFLAGS :=LDFLAGS +=SHELL = /bin/shSOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS)))) OBJS = $(foreach x,$(SRCEXTS),\$(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))DEPS = $(patsubst %.o,%.d,$(OBJS)).PHONY: all objs clean cleanall rebuildall : $(PROGRAM)%.d : %.c@$(CC) -MM -MD $(CFLAGS) {1}lt;%.d : %.C@$(CC) -MM -MD $(CXXFLAGS) {1}lt;objs : $(OBJS)%.o : %.c$(CC) -c $(CPPFLAGS) $(CFLAGS) {1}lt;%.o : %.cpp$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) {1}lt;$(PROGRAM) : $(OBJS)ifeq ($(strip $(SRCEXTS)),.c)$(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS)else$(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS)endif-include $(DEPS)rebuild: clean callclean:@$(RM) *.o *.dcleanall: clean@$(RM) $(PROGRAM) $(PROGRAM).exe2 通用Makefile——2############################################################################### ## Generic Makefile for C/C++ Program## Author: whyglinux (whyglinux AT hotmail DOT com)# Date: 2006/03/04# Description:# The makefile searches in <SRCDIRS> directories for the source files# with extensions specified in <SOURCE_EXT>, then compiles the sources# and finally produces the <PROGRAM>, the executable file, by linking# the objectives.# Usage:# $ make compile and link the program.# $ make objs compile only (no linking. Rarely used).# $ make clean clean the objectives and dependencies.# $ make cleanall clean the objectives, dependencies and executable.# $ make rebuild rebuild the program. The same as make clean && make all.#===================================================================== =========## Customizing Section: adjust the following if necessary.##==================================================================== =========# The executable file name.# It must be specified.# PROGRAM := a.out # the executable namePROGRAM :=# The directories in which source files reside.# At least one path should be specified.# SRCDIRS := . # current directorySRCDIRS :=# The source file types (headers excluded).# At least one type should be specified.# The valid suffixes are among of .c, .C, .cc, .cpp, .CPP, .c++, .cp, or .cxx.# SRCEXTS := .c # C program# SRCEXTS := .cpp # C++ program# SRCEXTS := .c .cpp # C/C++ programSRCEXTS :=# The flags used by the cpp (man cpp for more).# CPPFLAGS := -Wall -Werror # show all warnings and take them as errorsCPPFLAGS :=# The compiling flags used only for C.# If it is a C++ program, no need to set these flags.# If it is a C and C++ merging program, set these flags for the C parts.CFLAGS :=CFLAGS +=# The compiling flags used only for C++.# If it is a C program, no need to set these flags.# If it is a C and C++ merging program, set these flags for the C++ parts.CXXFLAGS :=CXXFLAGS +=# The library and the link options ( C and C++ common).LDFLAGS :=LDFLAGS +=## Implict Section: change the following only when necessary.##==================================================================== =========# The C program compiler. Uncomment it to specify yours explicitly.#CC = gcc# The C++ program compiler. Uncomment it to specify yours explicitly.#CXX = g++# Uncomment the 2 lines to compile C programs as C++ ones.#CC = $(CXX)#CFLAGS = $(CXXFLAGS)# The command used to delete file.#RM = rm -f## Stable Section: usually no need to be changed. But you can add more.##==================================================================== =========SHELL = /bin/shSOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))OBJS = $(foreach x,$(SRCEXTS), \$(patsubst %$(x),%.o,$(filter %$(x),$(SOURCES))))DEPS = $(patsubst %.o,%.d,$(OBJS)).PHONY : all objs clean cleanall rebuildall : $(PROGRAM)# Rules for creating the dependency files (.d).#---------------------------------------------------%.d : %.c@$(CC) -MM -MD $(CFLAGS) $<%.d : %.C@$(CC) -MM -MD $(CXXFLAGS) $<%.d : %.cc@$(CC) -MM -MD $(CXXFLAGS) $<%.d : %.cpp@$(CC) -MM -MD $(CXXFLAGS) $<%.d : %.CPP@$(CC) -MM -MD $(CXXFLAGS) $<%.d : %.c++@$(CC) -MM -MD $(CXXFLAGS) $<%.d : %.cp@$(CC) -MM -MD $(CXXFLAGS) $<%.d : %.cxx@$(CC) -MM -MD $(CXXFLAGS) $<# Rules for producing the objects.#---------------------------------------------------objs : $(OBJS)%.o : %.c$(CC) -c $(CPPFLAGS) $(CFLAGS) $<%.o : %.C$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<%.o : %.cc$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<%.o : %.cpp$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<%.o : %.CPP$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<%.o : %.c++$(CXX -c $(CPPFLAGS) $(CXXFLAGS) $<%.o : %.cp$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<%.o : %.cxx$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $<# Rules for producing the executable.#---------------------------------------------- $(PROGRAM) : $(OBJS)ifeq ($(strip $(SRCEXTS)), .c) # C file$(CC) -o $(PROGRAM) $(OBJS) $(LDFLAGS) else # C++ file$(CXX) -o $(PROGRAM) $(OBJS) $(LDFLAGS) endif-include $(DEPS)rebuild: clean allclean :@$(RM) *.o *.dcleanall: clean@$(RM) $(PROGRAM) $(PROGRAM).exe### End of the Makefile ## Suggestions are welcome ## All rights reserved ################################################################################## 下面提供两个例子来具体说明上面 Makefile 的用法。

相关文档
最新文档