zoukankan      html  css  js  c++  java
  • linux随笔

    Makefile 介绍
    ———————

    make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。

    首先,我们用一个示例来说明Makefile的书写规则。以便给大家一个感兴认识。这个示例来源于GNU的make使用手册,在这个示例中,我们的工程有8个C文件,和3个头文件,我们要写一个Makefile来告诉make命令如何编译和链接这几个文件。我们的规则是:
    1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
    2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
    3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。

        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 : 
                rm edit main.o kbd.o command.o display.o \ 
                   insert.o search.o files.o utils.o 

    反斜杠(\)是换行符的意思。这样比较便于Makefile的易读。我们可以把这个内容保存在文件为“Makefile”或“makefile”的文件中,然后在该目录下直接输入命令“make”就可以生成执行文件edit。如果要删除执行文件和所有的中间目标文件,那么,只要简单地执行一下“make clean”就可以了。 

    在这个makefile中,目标文件(target)包含:执行文件edit和中间目标文件(*.o),依赖文件(prerequisites)就是冒号后面的那些 .c 文件和 .h文件。每一个 .o 文件都有一组依赖文件,而这些 .o 文件又是执行文件 edit 的依赖文件。依赖关系的实质上就是说明了目标文件是由哪些文件生成的,换言之,目标文件是哪些文件更新的。 

    在定义好依赖关系后,后续的那一行定义了如何生成目标文件的操作系统命令,一定要以一个Tab键作为开头。记住,make并不管命令是怎么工作的,他只管执行所定义的命令。make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。 

    这里要说明一点的是,clean不是一个文件,它只不过是一个动作名字,有点像C语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找文件的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令,就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

    事实上,没有什么要比发现、培养、呵护、调整自己的心智的力量更重要的事情了.........

  • 相关阅读:
    (转载)C++ string中find() ,rfind() 等函数 用法总结及示例
    UVA 230 Borrowers (STL 行读入的处理 重载小于号)
    UVA 12100 打印队列(STL deque)
    uva 12096 The SetStack Computer(STL set的各种库函数 交集 并集 插入迭代器)
    uva 1592 Database (STL)
    HDU 1087 Super Jumping! Jumping! Jumping!
    hdu 1176 免费馅饼
    HDU 1003 Max Sum
    转战HDU
    hust 1227 Join Together
  • 原文地址:https://www.cnblogs.com/appleseed/p/2827564.html
Copyright © 2011-2022 走看看