大型程序中,人们希望工具自动识别修改的文件,而且不需要输入冗长的命令,就可以进行编译链接等操作,于是make工程管理器应运而生。
make可以自动识别文件时间戳,只处理修改的文件;make动作的依据是makefile文件makefile通常包含:
target:需要make创建的目标体,通常为目标文件和可执行文件dependency_file:target依赖的文件command:创建target时需要执行的命令,此行必须用Tab开头 target:dependency_files command /* 该行必须以Tab键开头,否则报错 */举例说明:
#The simplest example hello.o: hello.c hello.h gcc -c hello.c -o hello.o使用make target的形式:
make hello.o一个稍微复杂一点的例子:
有3个target,david、kang.o、yul.o,其中david依赖后面两个targetmake david时,会执行下面的cmd,会一级一级向下检查 david:kang.o yul.o gcc kang.o bar.o -o david kang.o:kang.c kang.h head.h gcc -Wall -O -g -c kang.c -o kang.o yul.o:bar.c head.h gcc -Wall -O -g -c yul.c -o yul.o挨个输入文件和编译选项比较麻烦,makefile支持用变量代替target、depandence、cmd以及其他部分。
分两种:
递归展开方式 VAR=var,在引用处展开;需注意对自己的递归可能导致无限循环 例如 CFLAGS = $(CFLAGS) -O,就会无限循环简单扩展方式 VAR := var,在定义处一次性展开用变量重写上面的例子
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g david:$(OBJS) $(CC) kang.o bar.o -o david kang.o:kang.c kang.h head.h $(CC) $(CFLAGS) -c kang.c -o kang.o yul.o:yul.c yul.h $(CC) $(CFLAGS) -c yul.c -o yul.otarget和depandence已经出现了文件,后面可用自动变量替代这些文件,起到简化makefile的目的。
$* : 不包含扩展名的target文件名称$+ : 所有的depandence文件,以空格分开,可能有重复$< : ==第一个depandence文件==$? : 所有时间戳比target晚的depandence文件$@ : ==target文件的完整名称==$^ : ==所有的depandence文件,以空格分开,不重复==$% : 如果目标文件是归档文件,则表示目标的归档成员名称用自动变量重写刚才的例子:
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g david:$(OBJS) $(CC) $^ -o $@ kang.o:kang.c kang.h head.h $(CC) $(CFLAGS) -c $< -o $@ yul.o:yul.c yul.h $(CC) $(CFLAGS) -c $< -o yul.o上述makefile写的比较全面,即显性方式。还支持隐形方式去掉,简化一些代码
只要告诉make目标文件,make会自动搜索隐含规则完成编译。 上述makefile可以进一步简化,==省掉了最后两行,依赖中的kang.o yul.o,make会自动搜索kang.c和yul.c== 隐含规则只能查找相同文件名,例如test.o会查找test.c
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g david:$(OBJS) $(CC) $(CFLAGS) $^ -o $@常用的隐含规则:
C编译,.c编程.o:$(CC) -c $(CPPFLAGS) $(CFLAGS)C++编译,.cc或.c编程.o:$(CC) -c $(CPPFLAGS) $(CXXFLAGS)Pascal编译,.p编程.o:$(PC) -c $(PFLAGS)Fortan编译,.r编程.o:$(FC) -c $(FFLAGS)定义相同处理规则的多个文件,文件必须用%开头 上述可改写为:
OBJS = kang.o yul.o CC = gcc CFLAGS = -Wall -O -g david:$(OBJS) $(CC) $(CFLAGS) $^ -o $@ %.o:%.c $(CC) -c $(CFLAGS) $< -o $@转载于:https://www.cnblogs.com/liuwanpeng/p/8119332.html
