makefile

项目的代码管理工具。

记录了如何编译程序的步骤。

规则三要素:目标、依赖、命令。 格式:

目标:依赖条件。
    命令。

最终目标必须写在文件最上面。

例:

app:main.c add.c sub.c mul.c
    gcc main.c add.c sub.c mal.c –o app

命令前必须是tab缩进。 执行makefile:make命令就是去找makefile里的终极“目标”,然后执行对应的命令。

为了让编译效率提高,可修改为:

app:main.o add.o sub.o mul.o
    gcc main.o add.o sub.o mal.o –o app
main.o:main.c
    gcc –c main.c
add.o:add.c
    gcc –c add.c
sub.o: sub.c
    gcc –c sub.c
mul.o: mul.c
    gcc –c mul.c

此时如果只修改了add.c,再make时,只会对add.c进行重新编译(原理是在寻找add.o依赖时,会对add.o和add.c的修改时间进行对比)

makefile中有【变量】【模式匹配】【自动变量】

自动变量只能在某条规则内部的【命令】里使用。

  • $<:所属规则中的第一个依赖;
  • $@:所属规则中目标;
  • $^:规则中的所有依赖;

因此上面的makefile可以改为:

obj =main.o add.o sub.o mul.o    # obj:变量,引用时用$(),和shell编程一样
target=app
$(target):$(obj)
    gcc $(obj) –o $(target)
% .o:%.c                         # %:模式匹配,当上面规则在找依赖时会自动将其代入到%,如查找第一个main.o时,会将%.o替换成main.o
    gcc –c $< -o $@

makefile里还有函数,所有的函数都有返回值。 就不用再手动给obj变量赋值需要的.o文件了,只需要通过函数调用即可完成,makefile可被修改为:

src=$(wildcard  ./*.c)                ##查找某目录下的.c (wildcard: 函数名,后面跟参数)
obj=$(patsubst ./%.c, ./%.o, $(src))        ##将.c替换成.o
CC=gcc                                ##makefile本身维护的变量(大写)(有默认值),
##用户可以修改
target=app
$(target):$(obj)
    gcc $(obj) –o $(target)
%.o:%.c
    gcc –c $< -o $@
clean:                            
    rm $(obj) $(target)

上面的clean用来清理.o和可执行程序 使用命令:make clean(此时不会再执行上面的规则,只会执行make后面对应的目标)

Copyright © qgao 2021-* all right reserved,powered by Gitbook该文件修订时间: 2022-06-06 16:56:43

results matching ""

    No results matching ""