Linux: Make工具以及Makefile文件

make工具

人们通常利用 make 工具来自动完成编译工作。这些工作包括:如果仅修改了某几个源文件,则只重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译。

Makefile

make 工具通过一个称为 makefile 的文件来完成并自动维护编译工作。makefile 需要按照某种语法进行编写,其中说明了如何编译各个源文件并连接生成可执行文件,并定义了源文件之间的依赖关系。当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件。

Makefile基本规则

  1. TARGET … : DEPENDENCIES …
  2. COMMAND
  3. 目标(TARGET)程序产生的文件,如可执行文件和目标文件 -o;目标也可以是要执行的动作,如“clean”。
  4. 依赖(DEPENDENCIES)是用来产生目标的输入文件,一个目标通常依赖于多个文件
  5. 命令(COMMAND)是make执行的动作,一个可以有多个命令,每个占一行。注意:每个命令行的起始字符必须为TAB字符
  6. 如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,这就是Makefile最核心的内容

makefile文件的编写:

1.创建makefile

目标(程序产生的文件):依赖

命令......

单文件

多文件的编写:

clean: rm -rf main.c xxx.o删除目标/依赖

2.运行makefile:

在项目目录下运行make命令,找到项目根目录下的makefile文件倒序执行----> 生成可执行文件 main

make命令: 自动调用makefile文件,后生成可执行文件

3.运行可执行文件./main   chmod u+x xxx

4.如果修改了代码

5. 则利用make clean命令: 将产生的可执行文件以及相关.o(过程文件)文件删除

再进行make操作,即可生成新的可执行文件

6. 重复2.3.4.5步骤即可

符号化:

$^(依赖列表): 表示所有的依赖文件 $<:第一个依赖文件 $@:生成的目标文件名

make自动推导:一旦新增加源文件就要修改

  1. GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
  2. 只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中,如果make找到一个whatever.o,那么 whatever.c,就会是whatever.o的依赖文件。并且 gcc -c whatever.c 也会被推导出来

    例:

    objects=main.o add.o subtract.o

    main:$(objects)

    gcc $(objects) -o main

    //标红的位置,可以不写,make可以进行自动推导,将对应的依赖文件找出

    main.o: add.h subtract.h

    add.o: add.h

    subtract.o: subtract.h

    clean:

    rm -f main main.o add.o subtract.o

Makefile中常见函数

wildcard函数: 当前目录下匹配模式的文件      

例如:src=$(wildcard *.c)

notdir函数:    去除路径                      

例如:$(notdir $src)

patsubst函数: 模式匹配替换                

例如:$(patsubst%.c,%.o,$src)  等价于$(src:.c=.o)

shell函数: 执行shell命令  

单级目录使用函数:

多级目录Makefile

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值