makefile基础

makefile

    -linux自带的构建器,构造的规则写在makefile中

makefile文件的命名

    -makefile或者Makefile

规则

    -三个部分:目标、依赖、命令

    书写规则如下

    目标:依赖

    (tab缩进)命令

    (注:makefile里面有多种规则组成)

e.g:

app:a.c b.c c.c

	gcc a.c b.c c.c -o app

第一个版本

app:main.c add.c sub.c mul.c
	gcc main.c add.c sub.c mul.c -o app
缺点:效率低,修改一个文件,所有的文件会被全部重新编译

第二个版本

app:main.o add.o sub.o mul.o
	gcc main.o add.o sub.o mul.o -o app

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

add.o:add.c
		gcc add.c -c

sub.o:sub.c
		gcc sub.c -c
		
mul.o:mul.c
		gcc mul.c -c

多条规则工作原理:
1、检查文件是否存在,若文件不存在,则向下搜索下面的规则,如果有规则是用来生成查找的依赖的,执行规则中的命令

2、如果依赖存在,判断是否需要更新时间。原则: 目标的时间 > 依赖的时间, 反则需要更新

缺点:相似的部分多,冗余

第三个版本

需要知识点:

    -自定义变量

        obj= a.o b.o c.o
        obj=10
        变量取值: aa=$(obj)

    -makefile自带的变量(大写):

        CPPFLAGS
        CC
    -自动变量:
        $@ 规则中的目标 
        $< 规则中的第一个依赖
        $^ 规则中的所有依赖
        注: 只能在规则中的命令中使用,不能再目标和依赖中使用

    -模式匹配规则: %.o:%.c

        第一次main.o没有,套用成

            main.o:main.c

            gcc -c main.c -o main.o

次add.o没有,套用成

add.o:add.c

gcc -c add.c -oadd.o

...

-注释用#

obj=main.o add.o sub.o mul.o
target=app

$(target):$(obj)
	gcc $^ -o $@

%.o:%.c
	gcc -c $< -o $@
缺点:可移植性差

第四个版本

-需要知识点

makefile所有的函数都有返回值

wildcard查找指定目录下的指定类型的文件 如: src=$(wildcard ./*.c)把当前目录下的所有的.c文件取出来

patsubst匹配替换: obj=$(patsubst %.c,%.o,$(src)) ,把$(src)变量里面的.c文件替换成.o文件

src=$(wildcard ./*.c)
obj=$(patsubst %.c,%.o,$(src))
target=app

$(target):$(obj)
	gcc $^ -o $@

%.o:%.c
	gcc -c $< -o $@
缺点:不能清理项目

第五个项目
-编写一个清理项目的规则

clean:
-mkdir /abc
-rm $(obj) $(target) -f

注:在命令前加-,如果当前命令执行出错,继续执行下面的命令不会终止,忽略执行出错的命令,继续执行

声明伪目标:好处,不会做更新检查,不做比对

src=$(wildcard ./*.cc)
obj=$(patsubst %.cc,%.o,$(src))
target=app

$(target):$(obj)
	gcc $^ -o $@

%.o:%.cc
	gcc -c $< -o $@
	
.PHONY:clean
clean:
	-rm $(obj) $(target) -f










猜你喜欢

转载自blog.csdn.net/u014043213/article/details/80065706