makefile复习笔记1

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