makefile复习笔记1
- 源文件——中间目标文件——执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)。 给中间目标文件打个包,叫“库文件”。
- make命令根据 GNUmakefile或makefile或 Makefile 编译链接。 make的“-f”和“--file”参数指定makefile文件。找文件中的第一个目标文件(target)。规则:编译针对没编译过的或修改了的文件。 make会一层又一层地去找文件的依赖关系。
- target可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。
- prerequisites就是,要生成那个target所需要的文件或是目标。
- command也就是make需要执行的命令。(任意的shell命令) 一定要以一个tab键作为开头。也可以在prerequisites加分号后面
- 变量:obj= file1.o file2.o 使用:$(obj) 好处:方便修改;
- 隐晦规则( 自动推导命令和文件):根据test.o自动添加test.c 和cc -c test.c; eg: $(objects) : defs.h;kbd.o command.o files.o : command.h
- 伪目标文件:.PHONY : clean; “.PHONY” 避免和文件重名,表示clean是个伪目标文件 。-rm中的-代表忽略错误继续执行。 clean从来都是放在文件的最后。 伪目标也可以指定所依赖的文件,一口气生成若干个可执行文件。 .PHONY : 可以不写,但 建议:显式写出是一个好习惯。
- makefile自动生成依赖:.d文件,gcc -MM main.c——main.o:main.c main.h
- 静态模式: 自动化变量“$<”表示所有的依赖目标集,“$@”表示目标集。<targets...>: <target-pattern>:<prereq-patterns...><commands>
- 多目标: bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
- Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示(1,引用文件;2, 指定Makefile中的有效部分;3, 定义一个多行的命令)和注释(#)。
- 引用:-include foo.make *.mk$(bar)。-表示忽略错误继续执行。寻找:当前目录—— “-I”或“--include-dir”参数指定目录——系统include目录;先警告、继续下面的、结束后重新找前面过不去的、还是不行就发出错误,-可以忽略错误。 在include前面可以有一些空字符,但是绝不能是[Tab]键开始。
- 环境变量MAKEFILES:所有make命令都会引用它(故 一定不要设置这个变量 )。环境变量Makefile的“目标”不会起作用,如果环境变量中定义的文件发现错误,make也会不理。
- 规则包含两个部分,一个是依赖关系,一个是生成目标的方法。第一条规则中的目标将被确立为最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。
- make步骤:1,读入所有的Makefile。2,读入被include的其它Makefile。3,初始化文件中的变量。4,推导隐晦规则,并分析所有规则。5,为所有的目标文件创建依赖关系链。6,根据依赖关系,决定哪些目标要重新生成。7,执行生成命令。
- 通配符:“*”,“?”和“~”(用户主目录)
- makefile文件搜索:1,特殊变量: VPATH = src:../headers 2, “vpath”关键字1、vpath <pattern> <directories>:为符合模式<pattern>的文件指定搜索目录<directories>。“%”的意思是匹配零或若干字符2、vpath <pattern>:清除符合模式<pattern>的文件的搜索目录。3、vpath :清除所有已被设置好了的文件搜索目录。
- “@”字符在命令行前,这个命令将不被make显示出来
- make执行时,带入make参数“-n”或“--just-print”,那么其只是显示命令,但不会执行命令. make参数“-s”或“--slient”则是全面禁止命令的显示.
- 让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令
- 命令出错:1,使用-忽略单个命令错误。2,全局方法:make -i或 --ignore-errors。3, 规则是以“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。4, make的参数的是“-k”或是“--keep-going”则中止此 规则 ,继续其他规则。
- 定义命令包:命令序列的语法以“define”开始,以“endef”结束。使用:$(命令包名)。
- 嵌套执行:cd subdir && $(MAKE)。 总控Makefile的变量传递到下级的Makefile中,但是不会覆盖下层的Makefile中所定义的变量,除非指定了“-e”参数。
- (不)向下层makefile传递变量variable...:(un)export <variable...>;可以向下层传递所有变量,只需export就行了
- “-w”或是“--print-directory”会在make的过程中输出一些信息,让你看到目前的工作目录。如 make: Entering directory `/home/hchen/gnu/make'.
- “-C”参数来指定make下层Makefile时,“-w”会被自动打开的。如果参数中有“-s”(“--slient”)或是“--no-print-directory”,那么,“-w”总是失效的。

浙公网安备 33010602011771号