美文网首页
跟我一起写makeflie---学习总结

跟我一起写makeflie---学习总结

作者: Ewan_hei | 来源:发表于2016-06-16 21:25 被阅读0次

    makefile关系到了整个工程的编译原则,会不会写makefile从侧面说明了一个人是否具备完成大型工程的能力。在Unix下将源文件编译成中间代码文件,也就是.o文件,即object file,再把大量的object file合成可执行文件,这个动作叫做链接(link)。当源文件过多的时候,我们通过makefile 文件去管理这些中间目标文件,用make命令去执行makefile文件。
    一、makefile的编写规则
    make命令编译和链接makefile的规则是:
    1) 如果这个工程没有编译过,所有的C文件都要编译并链接;
    2) 如果这个工程的某几个C文件被修改,我们只编译被修改的C文件,并链接目标程序;
    3) 如果工程的头文件被改变了,需编译引用了这几个头文件的C文件,并链接目标程序。
    makefile的规则:
    target...:prerequisites...
    command
    ...
    ...
    target是一个目标文件,可以是Object File,也可以是执行文件,还可以是一个标签。prerequisites就是生成target所需的文件或者目标,command是需要执行的命令。
    二、如何书写makefile
    1)规则举例
    foo.o:foo.c defs.h #foo模块
    cc -c -g foo.c
    foo.o是我们的目标,foo.c和defs.h是目标所依赖的源文件,而只有一个命令“cc -c -g foo.c”(命令必须以tab开头),这个规则告诉我们两件事:
    a.文件的依赖关系,foo.o依赖于foo.c 和 defs.h文件;
    b.生成(或更新)foo.o文件。

    1. 规则用法
      target...:prerequisites...
      command
      ...

      target...:prerequisites...;command
      command
      ...
      target是文件名,以空格分开,可以使用通配符,可以是多个文件;
      command是命令行,如果与target...:prerequisites...在一行,可用 ; 号做分隔,如果不在同一行,则必须以【tab键】开头;
      prerequisites为目标所依赖的文件(或目标)。
      如果命令太长可以用“\”作为换行符,make对上一行有多少个字符没有限制。
      3)在规则中使用通配符
      makefile支持3个通配符:“*”,“?”和“[...]”,这和Unix的B-shell是相同的。
      4)自动化变量
      $@:表示规则中的目标文件集;
      $%:仅当目标是函数库文件,表示规则中的目标成员名。
      $<:依赖目标中的第一个目标名字;
      $? :所有比目标新的依赖目标的集合。以空格分隔
      $^:所有依赖目标的集合。以空格分隔。如果在依赖目标中有重复的,那么这个变量会去除重复的依赖目标,只保留一份。
      $+:类似"$^",不过它不去除重复的依赖项

    相关文章

      网友评论

          本文标题:跟我一起写makeflie---学习总结

          本文链接:https://www.haomeiwen.com/subject/ctnmdttx.html