初识makefile的结构

来源:互联网 发布:韩国网络剧推荐 编辑:程序博客网 时间:2024/06/05 07:01

1 makefile的意义

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

2 依赖的定义

这里写图片描述

makefile中元素的含义

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

规则中的注意事项

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

一个makefile的依赖示例

这里写图片描述

依赖规则

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

小技巧

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

编程实验:makefile的规则依赖

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

3 第一个make的编译案例

这里写图片描述

小技巧

  • 工程开发中可以将最终可执行文件名和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.ofunc.o : func.c    gcc -o func.o -c func.cmain.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 首次上传

参考资料


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