make与makefile的基本使用与深入

一、 工具make的使用与makefile脚本
背景:
make编译脚本解释
编译脚本makefile
make -f 脚本文件 目标
脚本文件:
1. 文本文件  (例如 demo.mk)
2. 基本构成语法
基本单位目标target
目标名:依赖目标
\t目标指令
\t目标指令
\t@目标指令   //加上@以后,在运行的时候,这一条目标指令就不会再控制台中输出了...
 

2.目标的划分
    目标依赖

  3.默认规则:
    a.不指定目标,执行第一个目标
    b.不指定make文件,默认文件是makefile Makefile
      makefile优先
  4.目标的调用规则:(make把目标当作文件)
    make执行目标:
      搜索与目标相同的文件
      如果文件存在,则判定日期。
      日期最新,则停止执行,输出提示
      日期不是最新,则进行执行。

      比较:当前目标与依赖目标

 --------》 换一句话说就是,当目标名不存在的时候,执行该条目标指令。若该目标名存在,则判断目标名的时间

是否是最新的。如果目标名的时间是最新的,则不执行其对应的目标指令,否则执行该条目标指令。

例子:

makefile文件编写如下:

var= inputInt.o add.o

xixi:
        ls -l
inputInt.o:inputInt.c
        gcc -c inputInt.c
add.o:add.c
        gcc -c add.c
libdemo1.so:$(var)
        gcc -shared -olibdemo1.so add.o inputInt.o
main:libdemo1.so
        gcc main.c -omain -ldemo1 -L.
.PHONY:clean
clean:
        @rm -f main

1)make main

[fedora@localhost day02_r3]$ make main
gcc -c inputInt.c
gcc -c add.c
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.


2)这时候如果再执行make main 指令,我们会看到以下信息:

[fedora@localhost day02_r3]$ make main
make: `main‘ is up to date.


3)如果我们删掉inputInt.o,再执行make main(删除add.o的现象是差不多的),这时候,我们会看到以下信息

[fedora@localhost day02_r3]$ rm inputInt.o
[fedora@localhost day02_r3]$ make main
gcc -c inputInt.c
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.


4)如果我们删掉libdemo1.so,再执行make main,这时候,我们会看到以下信息

[fedora@localhost day02_r3]$ rm libdemo1.so
[fedora@localhost day02_r3]$ make main
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.


5)如果我们删掉main,再执行make main,这时候,我们会看到以下信息

[fedora@localhost day02_r3]$ rm main
[fedora@localhost day02_r3]$ make main
gcc main.c -omain -ldemo1 -L.



  5.建议:
    只要有文件输出,就把任务作为一个目标,并且把输出的文件作为目标名。
    
  6.潜规则(不建议)
    .c目标与.o目标。
    查找.o目标,目标不存在,就把.o替换成.c
    如果.c存在,实施潜规则:直接调用gcc把.c执为.o

换一句话讲,所谓的潜规则就是,当作为依赖目标的.o文件不存在的时候,系统会自动的去找同名的.c文件是否存在,如果同名的.c文件存在,则系统会先将该同名的 .c 文件编译成 .o 文件.


例子:

1)先把当前目录中的inputInt.o 和add.o 文件删除,但保留inputInt.c 和add.c 文件

2)这时候的makefile文件如下所示(即这时候,环境中没有了libdemo1.so所依赖的.o文件):

var= inputInt.o add.o


xixi:
        ls -l
#inputInt.o:inputInt.c
  #      gcc -c inputInt.c
#add.o:add.c
  #      gcc -c add.c
libdemo1.so:$(var)
        gcc -shared -olibdemo1.so add.o inputInt.o
main:libdemo1.so
        gcc main.c -omain -ldemo1 -L.
.PHONY:clean
clean:
        @rm -f main

3)执行make main命令,这时候,你会在控制台中看到以下信息:

[fedora@localhost day02_r3]$ make main
cc    -c -o inputInt.o inputInt.c
cc    -c -o add.o add.c
gcc -shared -olibdemo1.so add.o inputInt.o
gcc main.c -omain -ldemo1 -L.


其中的,

cc    -c -o inputInt.o inputInt.c
cc    -c -o add.o add.c

就是这里的潜规则的体现。。。


  7.变量
    变量名=值 值
    
    $(变量名)  ${变量}  
  8.伪目标:
    不把目标作为文件处理的目标称为伪目标
    声明伪目标  
没有:
  1.make的配置
  2.make的变量的操作函数
  3.多make文件使用



例子:
var= inputInt.o add.o  #变量的定义

xixi:
        ls -l
inputInt.o:inputInt.c #这里体现了目标依赖
        gcc -c inputInt.c
add.o:add.c        #这里体现了多目标划分
        gcc -c add.c
libdemo1.so:$(var)   #变量的使用,还可以通过${var}的形式进行使用
        gcc -shared -olibdemo1.so add.o inputInt.o
main:libdemo1.so
        gcc main.c -omain -ldemo1 -L.
.PHONY:clean   #这里是伪目标的定义
clean:
        @rm -f main   #在目标指令之前加上@,这条目标走指令在执行的是偶不会再控制台中输出


make与makefile的基本使用与深入

上一篇:STL中map的使用


下一篇:HDU1087 Super Jumping! Jumping! Jumping!