zoukankan      html  css  js  c++  java
  • Makefile文件(一)_介绍

     参考原文http://blog.csdn.net/liang13664759/article/details/1771246/

    Makefile介绍:

    Makefile告诉make命令如何编译和链接文件,规则:

    1、如果这个工程没有编译过,那么所有c文件都要编译并链接

    2、如果某几个c文件被修改,那么只编译被修改的c文件,并链接目标程序

    3、如果头文件被改变,那么需要编译引用了这几个头文件的c文件并连接目标程序。

    一、Makefile规则:

    target... : prerequisites...
    
        command
    
    ...
    
    ...

    说明:target 为目标文件,可以是obj,也可以是可执行文件,还可以是标签(就是一个标识而已)

      prerequisites为,target所需要的文件,也就是target依赖的文件

      command,make需要执行的命令(可任意shell命令以【Tab】键开始,多条命令可以多行,也可以“;”隔开置于一行)

      target的目标文件依赖于prerequisites中的文件,生成规则定义在command中。prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行,这是Makefile的规则,也是Makefile的核心

    二、Makefile例子 

    例如:一个工程3个头文件,8个c文件。

    原始Makefile

    edit:main.o kbd.o command.o display.o/
    
    insert.o search.o files.o utils.o
    
      cc -o edit main.o kbd.o command.o display.o/
    
      insert.o search.o files.o utils.o
    
    main.o:main.c defs.h
    
      cc -c main.c
    
    kbd.o:kbd.c defs.h command.h
    
      cc -c kbd.c
    
    command.o:command.c  defs.h command.h
    
      cc -c command.c
    
    display.o : display.c defs.h buffer.h
    
      cc -c display.c
    
    insert.o: insert.c defs.h buffer.h
    
      cc -c insert.c
    
    search.o:search.c defs.h buffer.h
    
      cc -c search.c
    
    files.o: files.c defs.h buffer.h command.h
    
      cc -c files.c
    
    utils.o: utils.c defs.h
    
      cc -c utils.c
    
    clean://只是一个标签,其后没有依赖,make命令并不会执行其后定义的命令
    
      rm edit main.o kbd.o command.o display.o/      //仅当make clean显示指出标签名字,才执行其后面的命令
    
      insert.o search.o files.o utils.o

    三、make工作

    默认方式下,只输入make命令,那么:

    1、make会在当前目录下找到名字叫做“Makefile”或“makefile”的文件。

    2、如果找到,会找文件中的第一个目标文件(target),在上面例子中,他会找到“edit”文件,并将其作为最终的目标文件

    3、如果edit不存在,或是edit所依赖文件的修改时间要比edit文件新,那么就会执行后面所定义的命令来生成edit文件

    4、如果edit所依赖的.o文件不存在,那么make会在当前文件中找到目标为.o文件的依赖性,如果找到再根据那个规则生成.o文件

    5、当然,c文件和h文件是存在的,于是make会生成.o文件,然后再用.o文件生成edit文件。

    说明:make会一层一层地去找文件的依赖关系,直到编译出第一个目标文件,在寻找过程中,如果出现错误,比如最后被依赖的问文件找不到,那么make就会直接退出并报错;而对于所定义的命令的错误或是编译不成功,make根本不理会

    所以,clean这种没有被第一个目标文件直接或间接关联,后面所定义的命令不会被自动执行。但是可以显示要make的执行,“make clean”

    编译中,如果其中一个源文件被修改,file.c,那么file.o会被重新编译,所以file.o是新的文件,比edit要新,所以edit也会被重新连接。如果改变了“command.h”,那么kbd.o、command.o和files.o都会被编译,并且,edit会被重新连接。

    四、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:main.c defs.h
    
      cc -c main.c
    
    ......
    
    clean:
    
      rm edit $(objects)

    五、让make自动推导

    只要make看到一个.o文件,他会自动把.c文件加到依赖关系中,如果make找到一个whatever.o,那么whatever.c就会是whatever.o的依赖文件。并且cc -c whatever.c也会被推导出来,于是

    make的 "隐晦规则"

    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  //.PHONY表示clean是个伪目标文件
    
    clean:
    
      rm edit $(objects)

    六、另类风格的Makefile:

    objects = main.o kbd.o command.o display.o/
    
          insert.o search.o files.o utils.o
    
    edit: $(objects)
    
      cc -o edit $(objects)
    
    $(objects): defs.h
    
    kbd.o command.o files.o: command.h
    
    display.o insert.o search.o files.o: buffer.h
    
    .PHONY:clean
    
    clean:
    
    r  m edit $(objects)

    七、清空目标文件规则

    makeMakefile都用该写一个清空目标文件(.o和执行文件)的规则,不仅便于重新编译,也利于保持文件的清洁。

    一般:

    clean:
      rm edit $(objects)

    更为稳健的做法:

    .PHONY: clean
    
    clean:
    
      -rm edit $(objects)//rm前面的-,表示就算某些文件出现问题也继续做后面的事情。

    说明:clean的规则不要放在文件的开头,不然就会成为make的默认目标。一般,clean都是放在文件的最后。

      

  • 相关阅读:
    DEEP COMPRESSION小记
    python中join的用法
    Ubuntu下pycharm安装
    java.lang.ClassNotFoundException
    12种排序算法(转载)
    会场安排问题
    在GitHub上上传项目(转载)
    实现prim算法
    经典进程同步与互斥习题总结
    实现迪杰斯特拉算法
  • 原文地址:https://www.cnblogs.com/weiyi-mgh/p/6934985.html
Copyright © 2011-2022 走看看