Makefile的使用

一、Makefile的概念

        make是一个命令工具,是一个解释Makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++下的make,LInux下GNU的make等等。

二、Makefile的优点

 1、自动化编译

        一旦写好,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率

        单个依赖流程图

        多个依赖流程图

       

目标:指我们最终需要得到的结果                                       依赖:指生成这个结果所需要的文件

2、编译效率高

        通过文件的时间戳,判断文件是否修改过,若修改过则只执行修改的部分,从而提高了编译的效率

三、Makefile的基本语法

target :prerequisites ...... ;

        command

①target-->就是一个目标文件,可以使Object文件,也可以是执行文件,还可以是一个标签(Label),对于标签

②prerequisites-->就是要生成目标文件所需要的文件或目标

③command-->就是make需要执行的命令(任意的shell命令)

/*一步编译*/
test:add.c sub.c test.c
        gcc add.c sub.c test.c -o test      //将这三个.c文件直接生成test可执行文件
/*多步编译*/
test:add.o sub.o test.o
    gcc add.o sub.o test.o -o test      //通过这个三个.o文件生成test可执行文件

add.o:add.c
    gcc -c add.c -o add.o           //通过.c文件生成.o文件
sub.o:sub.c
    gcc -c sub.c -o sub.o
test.o:test.c
    gcc -c test.c -o test.o

.PHONY:clean                 //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean:                       //clean是伪目标,其无依赖文件
    rm *.o                   //删除所有过程文件(.o文件)

四、变量

1、自定义变量

        ①x=a     变量在声明时需要给予初值

        ②$(x)或${x}       取值

        ③如果要使用真实的$字符,则需要用$$表示

2、变量的赋值

        ① =   最基本的赋值方式,与在文中的位置无关,系统自动推导将最终的赋值作为该变量的值

        ② ?=    当某变量前面已经定义赋值过,则不执行本次定义赋值,否则执行本次赋值

        ③ :=     覆盖赋值,假如某变量在前面已经定义赋值过,则将本次赋值作为最新的变量值

        ④ +=    追加赋值,旧值保持不变,将新值黏贴到旧值后面

SRC=add.o sub.o test.o             //定义一个变量SRC,将三个.o文件赋值给SRC

test:$(SRC)
    gcc ${SRC} -o test      //通过变量SRC的值生成test可执行文件

add.o:add.c
    gcc -c add.c -o add.o           //通过.c文件生成.o文件
sub.o:sub.c
    gcc -c sub.c -o sub.o
test.o:test.c
    gcc -c test.c -o test.o

.PHONY:clean                 //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean:                       //clean是伪目标,其无依赖文件
    rm *.o                   //删除所有过程文件(.o文件)
SRC=add.o 
SRC+=sub.o 
SRC+=test.o             

test:$(SRC)
    gcc ${SRC} -o test      //通过变量SRC的值生成test可执行文件

add.o:add.c
    gcc -c add.c -o add.o           //通过.c文件生成.o文件
sub.o:sub.c
    gcc -c sub.c -o sub.o
test.o:test.c
    gcc -c test.c -o test.o

.PHONY:clean                 //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean:                       //clean是伪目标,其无依赖文件
    rm *.o                   //删除所有过程文件(.o文件)
3、自动变量

        ① $*   不包含扩展名的目标文件名称

        ② $+    所有的依赖文件,以空格分开,并以出现的先后为序,可能会有重复的依赖文件

        ③ $^     所有不重复的目标依赖文件,以空格分开

        ④ $<   第一个依赖文件的名称

        ⑤ $@   目标文件的完整名称

SRC=add.o 
SRC+=sub.o 
SRC+=test.o         

test:$(SRC)
    gcc $^ -o $@      

add.o:add.c
    gcc -c $< -o $@           
sub.o:sub.c
    gcc -c $< -o $@
test.o:test.c
    gcc -c $< -o $@

.PHONY:clean                 //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean:                       //clean是伪目标,其无依赖文件
    rm *.o                   //删除所有过程文件(.o文件)
4、Makefile的隐含变量

        ①CC                  C编译器的名称,默认值为cc

        ②CPP                C预编译器的名称,默认值为$(CC)

        ③CXX                C++编译器的名称,默认值为g++

        ④CFLAGS         C编译器的选项,无默认值

        ⑤CPPFLAGS     C预编译器的选项,无默认值

        ⑥CXXFLAGS     C++编译器的选项,无默认值

SRC = add.o sub.o test.o         

CC = gcc

CFLAGS = -c -g -Wall

test:$(SRC)
    $(CC) $^ -o $@      

%.o:%.c                         //使用通配符,什么.c配什么.o
    $(CC) $(CFLAGS) $< -o $@           

.PHONY:clean                 //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean:                       //clean是伪目标,其无依赖文件
    rm *.o                   //删除所有过程文件(.o文件)

五、Makefile的函数

1、意义

        把一些功能封装起来,类似于C语言中的类

2、基本语法

        ①$(<function> <arguments>)

        ②${<function> <arguments>}

3、部分常用函数

        ①扩展通配符函数wildcard                 $(wildcard  PATTERN...)

        ②条件替换函数patsubst                    $(patsubst <pattern>,<replacement>,<text>)

SRC = $(wildcard *.c)         

OBJ = $(patsubst %.c,%.o,$(SRC))

CC = gcc

CFLAGS = -c -g -Wall

test:$(OBJ)
    $(CC) $^ -o $@      

%.o:%.c                         //使用通配符,什么.c配什么.o
    $(CC) $(CFLAGS) $< -o $@           

.PHONY:clean                 //解决同目录下出现同名clean文件而导致不执行此命令的问题
clean:                       //clean是伪目标,其无依赖文件
    rm *.o                   //删除所有过程文件(.o文件)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鯨觞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值