Makefile 学习
在写Makefile时可能会出现{“遗漏分隔符”}的错误,则需要看一下在换行时是否加 tab 。在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。
例:银行出纳(显式规则)
cal : admit.o main1.o main.o user.o / // target ... : prerequisites ...
withdraw.o
value = admit.o main1.o main.o user.o withdraw.o
cc=g++
edit :
$(cc) -o edit $(value) //换行需要按tab // "command"
.PHONY : edit
main.o : main.cpp main.h
$(cc) -c main.cpp
main1.0 : main1.cpp main.h
$(cc) -c main1.cpp
user.o : user.cpp user.h
$(cc) -c user.cpp
withdraw.o : withdraw.cpp withdraw.h
$(cc) -c withdraw.cpp
admit.o : admit.cpp admit.h
$(cc) -c admit.cpp
clean :
rm $(value)
还可以这样使用Makefile(隐晦规则)
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
.PHONY : clean
clean :
rm edit $(objects)
成功编译的:
value = admit.o main1.o main.o user.o withdraw.o
cc=g++
edit : $(value); $(cc) -o edit $(value) \
-I/local/include/SDL -lSDL -lSDL_image -lSDL_ttf
main.o : main.h
main1.0 : main.h
user.o : user.h
withdraw.o : withdraw.h
admit.o : admit.h
clean :
rm edit $(value)
其自己会自动寻找依赖关系,make可以自动推导命令。
3。makefile中引用其他的makefile使用include<filename>,在include的前面可以有一些空字符,但绝不能用 tab 开始;其他用法与c语言中的include的差不多。
4.-include <filename>
其表示,无论include过程中出现什么错误,都不要报错继续执行。和其它版本make兼 容的相关命令是sinclude,其作用和这一个是一样的。
5.而命令中的“$<”和“$@”则是自动化变量,“$<”表示所有的依赖目标集(也就是“foo.c bar.c”),“$@”表示目标集(也就是“foo.o bar.o”)。
6.$(filter %.o,$(files))表示调用Makefile的filter函数,过滤“$filter”集,只要其中模式为“%.o”的内容。
7. make 参数中文翻译
- b, - m 忽视了兼容性。
- b ,—— 总是无条件地使所有目标。
- c 目录, 目录——目录= 做任何事之前更改目录。
- d 打印大量的调试信息。
——调试[=旗帜]印刷各种类型的调试信息。
- e -环境 覆盖 环境变量覆盖makefile。
- f 文件——文件 =文件——makefile =文件
读文件作为一个makefile。
- h ,——帮助打印此消息并退出。
-I,——忽略错误忽略错误的命令。
-I 的目录,——包括dir =目录
搜索目录包括makefile。
- j[N],——工作[= N]允许N工作;无限的工作而且没有一次参数。
- k,——继续继续当一些目标不能使。
- l[N],——平均负载(= N),——马克斯负载[= N]
不要启动多个工作除非负荷低于N。
- l,——检查符号时代使用最新的mtime符号链接和目标之间。
- n,——只是打印,——,——侦察管制
不实际运行任何命令;只是打印它们。
- o文件——旧文件=文件——假设老=文件
考虑文件很旧,不改造它。
- p,——打印数据基地使内部数据库打印。
- q,,问题没有命令的退出状态运行,说如果到日期。
- r,——没有内置规则禁用内置的隐性规则。
- r,——没有内置变量禁用内置的变量设置。
- - - -沉默,不似命令——安静。
- s,——没有继续,——停止
关闭- k。
- t -触摸 触摸目标而不是改造他们。
- v,——版本打印版本号的制造和出口。
- w -打印 目录打印当前di
8.$(foreach <var>,<list>,<text>) 注意,foreach中的<var>参数是一个临时的局部变量,foreach函数执行完后,参数<var>的变量将不在作用,其作用域只在foreach函数当中。