0。前言粉丝留言,想知道如何使用Makefile构建多文件多级目录的工程,必须整理!关于Makefile的入门参考文章,可以先阅读这篇文章:《Makefile入门教程》为了让大家有一个更直观的体验,一扣老师将对之前写的一个小项目进行修改,本文将在此基础上进行修改这个项目。项目的详细设计和代码,见下:《从0写一个《电话号码管理系统》的C入门项目【适合初学者】》1.文件准备好了,开始吧!我们把项目的所有功能都放到了以其命名的c文件中函数,并将其放在具有相应名称的子目录中。例如allfree()函数存放在allfree/allfree.c中,最终目录结构如下图所示:peng@ubuntu:/mnt/hgfs/code/phone$tree..├──allfree│├──allfree.c│└──Makefile├──create│├──create.c│└──Makefile├──delete│├──delete.c│└──Makefile├──display│├──display.c│└──Makefile├──include│├──Makefile│└──phone.h├──init│├──init.c│└──Makefile├──login│├──login。c│└──Makefile├──main│├──main.c│└──Makefile├──Makefile├──menu│├──Makefile│└──menu.c├──scripts│└──Makefile└──search├──Makefile└──search.c11目录,22个文件直接看编译结果:peng@ubuntu:/mnt/hgfs/code/phone$makemake[1]:Enteringdirectory'/mnt/hgfs/code/phone/allfree'make[1]:Nothingtobedonefor'all'.make[1]:Leavingdirectory'/mnt/hgfs/code/phone/allfree'make[1]:Enteringdirectory'/mnt/hgfs/code/phone/create'make[1]:Nothingtobedonefor'all'.make[1]:Leavingdirectory'/mnt/hgfs/code/phone/create'make[1]:Enteringdirectory'/mnt/hgfs/code/phone/delete'make[1]:Nothingtobedonefor'all'.make[1]:Leavingdirectory'/mnt/hgfs/code/phone/delete'make[1]:Enteringdirectory'/mnt/hgfs/code/phone/display'make[1]:Nothingtobedfor'all'.make[1]:Leavingdirectory'/mnt/hgfs/code/phone/display'make[1]:Enteringdirectory'/mnt/hgfs/code/phone/init'make[1]:Nothingtobedonefor'all'.make[1]:Leavingdirectory'/mnt/hgfs/code/phone/init'make[1]:Enteringdirectory'/mnt/hgfs/code/phone/login'make[1]:Nothingtobedfor'all'.make[1]:Leavingdirectory'/mnt/hgfs/code/phone/login'make[1]:Enteringdirectory'/mnt/hgfs/code/phone/menu'make[1]:Nothingtobedonefor'all'.make[1]:Leavingdirectory'/mnt/hgfs/code/phone/menu'make[1]:Enteringdirectory'/mnt/hgfs/code/phone/search'make[1]:Nothingtobedonefor'all'.make[1]:Leavingdirectory'/mnt/hgfs/code/phone/search'make[1]:Enteringdirectory'/mnt/hgfs/code/phone/main'make[1]:Nothingtobedonefor'all'.make[1]:Leavingdirectory'/mnt/hgfs/code/phone/main'gcc-Wall-O3-ophoneallfree/*.ocreate/*.odelete/*.odisplay/*.oinit/*.login/*.omenu/*.osearch/*.omain/*.o-lpthreadphonemadeone!运行结果如下:2.Makefile常用基础知识点[0]Symbols'@''$''$$''-''-n'的解释1.'@'通常makefile会在执行前将其执行的命令行输出到屏幕上。如果在命令行前加'@',make将不会回显该命令。例子:@echo--compilingmodule----;//屏幕输出--compilingmodule----echo--compilingmodule----;//没有@screen输出echo--compilingmodule----2.'-'通常删除并创建一个文件。如果遇到不存在或者已经创建的文件,那么你要忽略这个错误继续执行。可以加上-,-rmdir;-mkdiraaadir;3.'$'美元符号$,主要展开和打开makefile中定义的变量4.'$$'$$符号主要展开和打开makefile中定义的shell变量[1]通配符说明:列出当前文件中的所有文件名匹配模式“PATTERN”格式的目录,并以空格分隔开来。“PATTERN”使用shell可识别的通配符,包括“?”(单个字符)、“*”(多个字符)等。示例:$(wildcard*.c)返回当前目录中所有.c源文件的列表。[2]patsubst说明:将字符串“x.c.cbar.c”中以.c结尾的单词替换为以.o结尾的字符。示例:$(patsubst%.c,%.o,x.c.cbar.c)函数返回结果为x.c.obar.o[3]notdir说明:去除文件名中的路径信息示例:src=(notdir./src/a.c)去除文件a.c的路径信息,使用(notdir./src/a.c)去除文件a.c的路径信息,使用(notdir./src/a.c)去除文件a.c的路径信息,使用(SRC)获取不带路径的文件名,即a.c.[4]包含头文件的路径使用-I+头文件的路径来指定编译器头文件的路径例子:INCLUDES=-I./inc$(CC)-c$(INCLUDES)$(src)[5]addsuffix函数名:添加后缀函数—addsuffix。语法:$(addsuffixSUFFIX,NAMES…)功能:为“NAMES…”中的每个文件名添加后缀“SUFFIX”。参数“NAMES...”是一个以空格分隔的文件名序列,“SUFFIX”附加到该序列中每个文件名的末尾。返回值:由单个空格分隔的文件名序列,后缀为“SUFFIX”。函数说明:例子:$(addsuffix.c,foobar)returnsfoo.cbar.c[6]包含另一个文件:include在Makefile中使用include关键字来包含其他的Makefile,这和C语言#include很相似,include文件将按原样放置在当前文件的包含位置。例如,命令includefile.dep扩展了当前Makefile中的file.dep文件,即将file.dep文件的内容包含到当前Makefile中。include前面可以有一些空字符,但不能以[Tab]键开头。.[7]foreachforeach函数与其他函数有很大不同。因为这个函数是用来循环的,所以语法是:$(foreach,,
