第二载:makefile的结构

    在上一篇中,我们只是简单的介绍了make跟makefile的基本概念,并且实现了一个简单的makefile,但是那个makefile仅仅是做一些打印工作,并没有什么实际性用途。在编写真正可用的makefile前,我们先来了解下makefile的结构。
    前边也提到,makefile的意义在于:
    1、makefile用于定义源文件间的依赖关系
    2、makefile说明如何编译各个源文件并生成可执行文件
    makefile的基本结构如下:
                                      目标 依赖
                                      [ Tab ]   命令   
       - 目标:通常为我们期望编译得到的可执行程序或者库
       - 依赖:指编译这个可执行程序或库所以要的源文件或其他目标,简称目标依赖于这些文件或库
       - 命令:指通过这些依赖,如何编译得到这个目标的命令,如gcc  -o xxx -c xxx.c 等

      注意:1、目标与依赖都可以是多个,目标与目标、依赖于依赖之间用空格分开即可
                 2、命令的前边必须要跟一个Tab空格

    有了以上的基本知识,下边来看一个makefile的依赖示例

all : test
    @echo "make all"
test:
    @echo "make test"

    从这个makefile的内容得知,all目标依赖于test,所以要all目标执行成功,首先test目标要执行成功,简单来说就是先依赖后目标
所以当我们执行make all的时候,会先打印 "make test" 再打印 "make all",如下。

/home/delphi/myshare/makefile>make all
make test
make all
/home/delphi/myshare/makefile>

    上边在每条命令前加了一个@符号,作用是不打印执行的命令,只打印结果,相当于一个小技巧

依赖规则:
   
1、当目标对应的文件不存在时,执行对应命令
    2、当
依赖在时间上比目标更新时(说明源文件有改动),执行对应命令
    3、当
依赖关系连续发生时,对比依赖链上的每一个目标

第一个make编译案例

hello.out all : main.o func.o
    gcc -o hello.out main.o func.o

main.o : main.c
    gcc -o main.o -c main.c

func.o : func.c
    gcc -o func.o -c func.c

源文件main.c与func.c如下

//main.c源文件
#include <stdio.h>

extern void fun();

int main()
{
    fun();

    return 0;
}

//func.c源文件
#include <stdio.h>

void fun()
{
    printf("hello makefile\n");
}

从makefile文件中我们知道,想得到的可执行程序为hello.out,分别依赖于main.o与func.o,而两个.o文件又分别作为两个子目标依赖于各自的.c源文件,关系即为:
    hello.out  ->  main.o  func.o
    main.o -> main,c
    func.o -> func.c

执行make

再执行一次

在第二次make的时候,因为两个.o依赖、hello.out都是最新的,所以就不需要再编译了,但是当我们执行 make all时,因为all目标在文件目录中不存在,两个.o已经存在并且没做改动,所以make all时只会进行强制链接

这就是为什么把hello.out 与 all都作为目标的原因,当需要强制链接时就执行make all;需要依据依赖是否更改决定是否链接时直接make即可

以上内容参考《狄泰软件学院》操作系统篇之 - makefile专题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值