C语⾔make和Makefile介绍及使⽤
1:make和Makefile的介绍:
六月的雨
概念
在软件的⼯程中的源⽂件是不计其数的,其按照类型,功能,模块分别放在若⼲个⽬录中,哪些⽂件需要编译,那些⽂件需要后编译,那些⽂件需要重新编译,甚⾄进⾏更复杂的功能操作,这就引⼊了我们的系统编译的⼯具:
在linux和unix中,有⼀个强⼤的使⽤程序,叫make,可以⽤它来管理多模块程序的编译和链接,直⾄⽣成可执⾏⽂件
make使⽤程序读取⼀个说明⽂件,称为Makefile,Makefile⽂件中描述了整个软件⼯程的编译规则和各个⽂件之间的依赖关系;Makefile就像是⼀个Shell脚本⼀样,其中可以执⾏操作系统的命令,它带来的好处就是我们能够实现“⾃动化编译”,⼀旦写好,只要⼀个make命令,整个软件功能就完全⾃动编译,极⼤的提⾼了软件开发的效率;
make是⼀个命令⼯具,是⼀个解释Makefile中指令的命令⼯具,⼀般来说⼤多数IDE都有这个命令
使⽤make可以是重新编译的次数达到最⼩化;
2:make和Makefile
1:make的使⽤语法:
make使⽤语法:
make [选项][⽬标][宏定义]
选项列表:
-d 显⽰调试信息(debug)
-f<⽂件> 指定从那个⽂件中读取以来关系,默认⽂件是"Makefile"或者"makefile","-"表⽰从标准输⼊(file)
-h 显⽰所有选项的简要说明(help)
-n 不运⾏任何Makefile命令,只去现实它们(no)
-s 安静的⽅式运⾏,不显⽰任何信息(silence)
可以使⽤-h来获取更多的选项:
2:Makefile的编写原则和规则
当make命令不带选项运⾏的时候,它从Makefile中读取指定规则
当制定规则不同与Makefile(makefile)的其他⽂件中时候,就要运⾏带有-f选项的make命令。如make.fray.Makefile
make -f make.fray.Makefile
Makefile的编写规则⼀:
⽬标列表:关联性列表
<TAB>命令列表
⽬标列表:是⽤⼀个或者多个空格分开的⽬标⽂件的清单
关联性列表:同样是⼀个或者多个空格分开的⽬标⽂件,是⽬标列表所以来的多个⽬标⽂件的清单;
命令列表:⽤于创建⽬标⽂件的将要执⾏的命令清单,这个命令列表被换⾏符号分开,命令列表中的每个命令必须要以<TAB>字符开始;
如:##Sample
power:power.c
gcc -o power power.c
如:#Sample
power:power.o demo.o
gcc -o power power.o demo.o
power.o:power.c
gcc -o power.o -c power.c
demo.o:demo.c
gcc -o demo.o -c demo.c
注意:书写的形式类似于倒推的形式
Makefile的编写规则⼆:(不建议使⽤)
⽬标列表:关联性列表;命令列表螺蛳养殖
命令列表是⼀系列被分号隔开的命令,⼀个很长的命令⾏要续⾏的时候需要⽤⼀个反斜杠符号
如:all/mymath_test:src/mymath.c src/mymath_test.c; \
gcc -o all/mymath_test src/mymath.c \
src/mymath_test.c
注意:makefile书写主要注意的是:
1:编译规则
2:依赖关系
3:倒推原理
4:使⽤make命令去执⾏
5:如果已经是最新的⽂件的时候,就不会再去编译执⾏了
6:make去读取makefile的时候,是按照依赖⽂件的顺序去查找并且执⾏命令的
7:make在编译的时候,如果发现被编译的⽂件已经是最新的了,就不会再去编译(减少了编译次数)
8:make⽂件是根据被编译⽂件的时间戳去判断⽂件是否是当前最新的⽂件,如果是最新的,那么就会去重新编译,如果不是最新的,就不会去进⾏编译;
9:千万要注意makefile中编译命令前⾯的分隔符
Makefile变量的使⽤
简单变量:
定义
变量名字:=[⽂本]
这类变量的实质就是⼀组字符串
添加
变量名字+=[⽂本]或者变量名字:=[⽂本][⽂本]
引⽤变量
$(变量名)
$单字符变量(指的是但字符的变量 a:=123 $a)
如:G:=gcc ⼀般我们都是定义成⼤写的
$G -o power power.c
内置变量:
$@ 当前⽬标的名词
$? ⽐当前⽬标更新的已修改的依赖性列表
$< 依赖性列表的第⼀个⽂件贾国宇
$^ ⽤空格分开的所有依赖性列表
虚⽬标
虚⽬标是不存在的⽂件
虚⽬标允许你去强制执⾏某些事件,但这些事件在正常的规则中是不会发⽣的
虚⽬标不是真正的⽂件,make命令可以使⽤针对他们的任意规则
虚⽬标总是使与之有关的命令被执⾏
all ⽣成⼯程中所有可以执⾏者,通常是makefile的第⼀个⽣成⽬标
test 运⾏程序的⾃动测试套件
clean 删除make all⽣成的所有⽂件
install 在系统⽬录中安装⼯程项⽬⽣成的可执⾏⽂件和⽂档
uninstall 删除make install安装的所有⽂件
特殊⽬标
make中有⼀些与定义的⽬标,这些预定义⽬标被make以⼀种特殊的⽅式进⾏处理,这些⽬标称为特殊⽬标;
.DEFAULTS 如果make找不到⽣成⽬标的任何makefile⼊⼝或后缀规则,就执⾏与⽬标相关的命令
.IGNORE 如果某⼀⾏makefile包含该⽬标,make忽略错误代码并继续建⽴,如果⼀个命令不正常存在,make⾃然会停⽌,带有-i选项的make命令可以执⾏相同的任务.PHONY唯美短句
允许你指定⼀个不是⽂件的⽬标,所以您能只是make调⽤⼀系列makefile中的命令,即使在当前⽬录中有⼀个具有相同名字的⽂件
.SILENT
make执⾏这些命令,但是不显⽰这些命令,带有-s的make可以执⾏相同的⼈物,
.SUFFIXES
为⽬标指定的前提(后缀)可以与后缀规则相互关联,如果与⽬标没有相关性的前提,以存在的后缀列表就会被删除
默认模式规则
make中有许多预定义的规则成为后缀规则,它可以让make⾃动执⾏许多任务
草房子杜小康为了建⽴⼀个⽬标,make会遍历⼀连串的依赖关系,这是为了决定从何处开始建⽴,如果没有找到⽬标⽂件,make就按有限顺序查找源⽂件
默认模式规则:
%o:%c
$(CC) $(CFLAGS) -c $<
$o:%s
$(CC) $(AFLAGS) -o $@ $<
Makefile中的相关通配符:
#:注释
\:连接符号
关联列表和命令列表中可以使⽤shell通配符号? * %等
附上⼀个简单的makefile
#Sample西瓜的英文单词
CC:=gcc
CFLAGS:=-Iinclude
新居落成对联CFLAGS+=-c
TARGET:=all/mytest_test3
DEPEND:=obj/mymath.o
DEPEND+=obj/mymath_test.o
仲裁申请书$(TARGET):$(DEPEND)
$(CC) -o $@ $^
#obj/mymath.o:src/mymath.c
# $(CC) -o $@ $(CFLAGS) $^
#obj/mymath_test.o:src/mymath_test.c
# $(CC) -o $@ $(CFLAGS) $^
#使⽤make中的默认的模式规则
obj/%.o:src/%.c
$(CC) -o $@ $(CFLAGS) $^
#声明clean是⼀个虚⽬标
.PHONY:clean
clean:
rm -rf obj/mymath.o obj/mymath_test.o
到此这篇关于C语⾔make和Makefile介绍及使⽤的⽂章就介绍到这了。希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。