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   #在目标指令之前加上@,这条目标走指令在执行的是偶不会再控制台中输出


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅气的东哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值