• Makefile


    简介
      什么是makefile。或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但要作一个professional的程序员,makefile还是必须要懂的。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,仅对GNU的make进行讲述,我的环境是Linux 14.02,make的版本是3.80。必竟,这个make是应用最为广泛的,也是用得最多的。在这里,仅对Makefile 的精简优化通过一个具体的例子进行说明。

      1 /**************************初始Makefile*******************************/
      2 edit : main.o kbd.o command.o display.o
      3        insert.o search.o file.o outil.o
      4     cc -o edit main.o kbd.o command.o display.o
      5         insert.o search.o file.o outil.o
      6 main.o : main.c defs.h
      7     cc -c main.o 
      8 kdb.o : kdb.c defs.h command.h 
      9     cc -c kbd.c 
     10 command.o : command.c defs.h command.h
     11     cc -c command.c
     12 display.o : display.c defs.h buffer.h
     13     cc -c display.c
     14 insert.o : insert.c defs.h buffer.h
     15     cc -c insert.c
     16 serach.o : search.c defs.h buffer.h
     17     cc -c search.c
     18 file.o : file.c defs.h buffer.h command.h
     19     cc -c file.c
     20 outil.o : outil.c defs.h
     21     cc -c outil.c
     22     
     23 clean:
     24     rm main.o kbd.o command.o display.o
     25        insert.o search.o file.o outil.o
     26  
     27 /**************************精简Makefile(1)*******************************/  
     28                           运用变量和通配符
     29                           $@ 目标文件
     30                           $^ 所有依赖文件
     31                           $* 不带扩展名的文件
     32                           $< 第一个依赖文件
     33 /************************************************************************/
     34 object = main.o kbd.o command.o display.o
     35        insert.o search.o file.o outil.o
     36 edit :$(objiect)   
     37     cc -c $@ $^
     38 main.o : main.c defs.h
     39     cc -c main.o 
     40 kdb.o : kdb.c defs.h command.h 
     41     cc -c kbd.c 
     42 command.o : command.c defs.h command.h
     43     cc -c command.c
     44 display.o : display.c defs.h buffer.h
     45     cc -c display.c
     46 insert.o : insert.c defs.h buffer.h
     47     cc -c insert.c
     48 serach.o : search.c defs.h buffer.h
     49     cc -c search.c
     50 file.o : file.c defs.h buffer.h command.h
     51     cc -c file.c
     52 outil.o : outil.c defs.h
     53     cc -c outil.c
     54     
     55 clean:
     56     rm edit $(object)
     57 /**************************精简Makefile(2)*******************************/ 
     58                                   运用变量和通配符
     59                          隐晦规则(遇到*.o文件自动推到其依赖*.c文件)
     60 /**************************************************************************/ 
     61 object = main.o kbd.o command.o display.o
     62        insert.o search.o file.o outil.o
     63 edit :$(objiect)
     64     cc -c $@ $^
     65 main.o : defs.h
     66     cc -c main.o 
     67 kdb.o : defs.h command.h 
     68     cc -c kbd.c 
     69 command.o : defs.h command.h
     70     cc -c command.c
     71 display.o : defs.h buffer.h
     72     cc -c display.c
     73 insert.o : defs.h buffer.h
     74     cc -c insert.c
     75 serach.o : defs.h buffer.h
     76     cc -c search.c
     77 file.o : defs.h buffer.h command.h
     78     cc -c file.c
     79 outil.o : defs.h
     80     cc -c outil.c
     81     
     82 clean:
     83     rm edit $(object)
     84     
     85 /**************************精简Makefile(3)*******************************/ 
     86                                    变量定义和通配符
     87                          隐晦规则(遇到*.o文件自动推到其依赖*.c文件)
     88                                     文件指示
     89 /**************************************************************************/ 
     90 object = main.o kbd.o command.o display.o
     91        insert.o search.o file.o outil.o
     92 edit :$(objiect)
     93     cc -c $@ $^
     94 $(object) : defs.h
     95 kbd.o command.o fille.o : comman.h
     96 display.o insert.o search.o file.o : buffer.h
     97 clean:
     98     rm edit $(object)
     99     
    100 /**************************精简Makefile(4)*******************************/ 
    101                                    变量定义和通配符
    102                          隐晦规则(遇到*.o文件自动推导其依赖*.c文件)
    103                                     文件指示
    104                               .PHONY clean表示clean是伪目标
    105 /*************************************************************************/     
    106 object = main.o kbd.o command.o display.o
    107        insert.o search.o file.o outil.o
    108 edit :$(objiect)
    109     cc -c $@ $^
    110 $(object) : defs.h
    111 kbd.o command.o fille.o : comman.h
    112 display.o insert.o search.o file.o : buffer.h
    113 .PHONY: clean
    114 clean:
    115     rm edit $(object)
    116     
    117 /******************************终极版***********************************/
    118 object = main.o kbd.o command.o display.o
    119        insert.o search.o file.o outil.o
    120 edit :$(objiect)
    121     cc -c $@ $^
    122 .PHONY: clean
    123 clean:
    124     rm edit $(object)
    海阔凭鱼跃,天高任鸟飞。
  • 相关阅读:
    Redis3.2集群部署安装
    熟悉SQL Server 数据类型
    泛型的参数简介和参数约束
    流(Stream)与文件流(FileStream)
    C#提取双引号中的字符串
    数组,一维数组,二维数组,交错数组
    结构,枚举
    C#中唯一的三元运算符
    位运算
    异常处理语句
  • 原文地址:https://www.cnblogs.com/chenshikun/p/5840352.html
Copyright © 2020-2023  润新知