初识makefile的结构

1 makefile的意义

  • makefile用于定义源文件间的依赖关系
  • makefile说明如何编译各个源文件并生成可执行文件

2 依赖的定义

初识makefile的结构_第1张图片

makefile中元素的含义

  • targets
    • 通常是需要生成的目标文件名
    • make所需执行的命令名称
  • prerequisites
    • 当前目标所依赖的其它目标或文件
  • command
    • 完成目标所需要执行的命令

规则中的注意事项

  • targets可以包含多个目标
    • 使用空格对多个目标进行分隔
  • prerequisites可以包含多个依赖
    • 使用空格对多个依赖进行分隔
  • [ Tab ]键:’\t’
    • 每一个命令行必须以[ Tab ]字符开始
    • [ Tab ]字符告诉make此行是一个命令行
  • 续行符:\
    • 可以将内容分开写到下一行,提高可读性

一个makefile的依赖示例

初识makefile的结构_第2张图片

依赖规则

  • 当目标对应的文件不存在,执行对应命令
  • 当依赖在时间上比目标更新,执行对应命令
  • 当依赖关系连续发生,对比依赖链上的每一个目标

小技巧

  • makefile中可以在命令前加上@符,作用为命令无回显

编程实验:makefile的规则依赖


all : test
    @echo "make all"

test :
    @echo "make test"

3 第一个make的编译案例

初识makefile的结构_第3张图片

小技巧

  • 工程开发中可以将最终可执行文件名和all同时作为makefile中第一条规则
  • all主要用来强制执行相关命令
hello.out all : main.o func.o
    gcc -o hello.out main.o func.o

编程实验:初探make编译

func.c:

#include "stdio.h"

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



main.c:

extern void foo();

int main()
{
    foo();

    return 0;
}   


makefile:

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

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

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

编程实验:make用于编译java程序

HelloJava.java:

public class HelloJava {
    public static void main(String[] args) {
        System.out.println("Hello Java!");
    }
}


makefile:

HelloJava.class all: HelloJava.java
    @javac HelloJava.java
    @java HelloJava

4 小结

  • makefile用于定义源文件间的依赖关系
  • makefile说明如何编译各个源文件并生成可执行程序
  • makefile的目标之间存在连续依赖关系
  • 依赖存在并且命令执行成功目标完成的充要条件

修改记录


时间 动作
2017.7.3 首次上传

参考资料


唐老师 — 狄泰软件学院 — 十二月提升计划

你可能感兴趣的:(实用工具)