Makefile 语法入门

Makefile 语法入门一、Makefile简介Makefile是一种常用于编译的脚本语言。它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译)。注意Makefile文件命令必须是Makefile或者makefile,并使用make命令编译。 二、1个规则1.语法规则目标…:依赖…命令1命令2…2.目标…

大家好,又见面了,我是你们的朋友全栈君。

一、Makefile 简介

Makefile 是一种常用于编译的脚本语言。它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译)。
注意 Makefile 文件命令必须是 Makefile 或者 makefile,并使用 make 命令编译。

 

二、1个规则

1. 语法规则

目标...: 依赖...
    命令1
    命令2
    ...

2. 目标

目标即要生成的文件。如果目标文件的更新时间晚于依赖文件的更新时间,则说明依赖文件没有改动,目标文件不需要重新编译。否则重新编译并更新目标。

3. 依赖

即目标文件由哪些文件生成。如果依赖条件中存在不存在的依赖条件,则会寻找其它规则是否可以产生依赖条件。

例如:规则一是生成目标 hello.out 需要使用到依赖条件 hello.o,但是 hello.o 不存在。则 Makefile 会寻找到一个生成 hello.o 的规则二并执行。

4. 命令

即通过执行该命令,由依赖文件生成目标文件。

注意每条命令前必须有且仅有一个 tab 保持缩进,这是语法要求。

5. ALL

Makefile 文件默认只生成第一个目标文件即完成编译,但是我们可以通过 “ALL” 指定需要生成的目标文件。

6. 示例

针对以上所说的,先写一个示例让大家了解一下,首先准备一个 hello.c:

#include <stdio.h>

int main()
{
    printf("Hello World !\n");
    return 0;
}

然后写一个 Makefile

ALL: hello.out

hello.out: hello.c
    gcc hello.c -o hello.out

编译并执行:

$ make
gcc hello.c -o hello.out
$ ./hello.out
Hello World !

 

三、2个函数

1. wildcard

例如

SRC = $(wildcard ./*.c)

匹配目录下所有的 .c 文件,并将其赋值给 SRC 变量。

2. patsubst

pat 是 pattern 的缩写,subst 是 substring 的缩写。例如

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

这个函数有三个参数,意思是取出 SRC 中所有的值,然后将 “.c” 替换为 “.o”,最后赋值给 OBJ 变量。

3. 示例

通过上面两个函数,加入我们目录下有很多个 “.c” 后缀的源文件,就不需要写很多条规则语句了,而是可以像下面这样写

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

ALL: hello.out

hello.out: $(OBJ)
        gcc $(OBJ) -o hello.out

$(OBJ): $(SRC)
        gcc -c $(SRC) -o $(OBJ)

这里我们先将所有的 “.c” 文件编译为 “.o” 文件,这样后面更改某个 “.c” 文件时,其它的 “.c” 文件将不再编译,而只是编译有更改的 “.c” 文件,可以大大节约大项目中的编译速度。

 

四、3个变量

Makefile 中也有一些已经定义好的常用变量,这里介绍其中常用的3个。

1. $@

表示规则中目标,例如 hello.out。

2. $<

表示规则中的第一个依赖条件,例如 hello.c

3. $^

表示规则中的所有依赖条件,由于我们示例中都只有一个依赖条件,这种情况下 $^ 和 $< 区别不大。

4. 示例

使用这些变量替换上面写的 Makefile,即是:

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

ALL: hello.out

hello.out: $(OBJ)
        gcc $< -o $@

$(OBJ): $(SRC)
        gcc -c $< -o $@

 

五、其它常用功能

1. 代码清理 clean

我们可以编译一条属于自己的 clean 语句,来清理 make 命令所产生的所有文件。例如

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

ALL: hello.out

hello.out: $(OBJ)
        gcc $< -o $@

$(OBJ): $(SRC)
        gcc -c $< -o $@

clean:
        -rm -rf $(OBJ) hello.out

这样我们就可以使用 clean 命令来清理生成的文件了:

$ ls
hello.c  hello.o  hello.out  Makefile
$ make clean
rm -rf  hello.o hello.out
$ ls
hello.c  Makefile

 

2. 伪目标 .PHONY

上面我们写了一个 clean 语句,使得我们执行 “make clean” 命令的时候,可以清理我们生成的文件。

但是假如还存在一个文件名就是 clean 文件,那么我们再执行 “make clean” 命令的时候就只是显示

$ make clean
make: `clean' is up to date.

解决方法就是我们使用伪目标,这样就可以避免出现上面的问题了,例如:

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

ALL: hello.out

hello.out: $(OBJ)
        gcc $< -o $@

$(OBJ): $(SRC)
        gcc -c $< -o $@

clean:
        -rm -rf $(OBJ) hello.out

.PHONY: clean ALL

通常,我们也会把 ALL 也设置为伪目标。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/133334.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • django drf jwt_jwt工作原理

    django drf jwt_jwt工作原理前言带着问题学习是最有目的性的,我们先提出以下几个问题,看看通过这篇博客的讲解,能解决问题吗?什么是JWT?为什么要用JWT?它有什么优势?JWT的认证流程是怎样的?JWT的工作原理?我们

  • origin双y轴柱状图_双Y轴柱状图和折线图

    origin双y轴柱状图_双Y轴柱状图和折线图Origin双Y轴柱状图画法及两柱重合有间居问题解决1、所遇问题2、作图方法1、所遇问题做双Y轴柱状图时,一开始是将左Y轴数据和右Y轴数据放在了两个sheet中,一顿操作最后发现两个柱要么重合要么有间距,怎么调都不行,就像下图这样。。。2、作图方法正确作图方法:1、将X数据左Y数据以及右Y数据放在一个sheet中,主要这里边的两个空列,是正确画图的关键。2、选择ABCD四列画柱状图,注意这里C列为误差,画出来图你就明白D列作用是让柱子向左偏一格。3、点击空白区域,右键加入右Y轴,也

  • adas毫米波雷达_雷达探测障碍物是超声波吗

    adas毫米波雷达_雷达探测障碍物是超声波吗ADAS超声波雷达在倒车入库,慢慢挪动车子的过程中,在驾驶室内能听到”滴滴滴“的声音,这些声音就是根据超声波雷达的检测距离给司机的反馈信息。倒车雷达系统,英文全称为REVERSING/PARKINGAIDSUBSYSTEM,BACKSENSOR或PACKINGSENSOR,英文简称RPA。目前被各种轿车特别是高级轿车作为汽车电装品的标准配置或售后的汽车电装品主是选配品,例如:德国…

  • 你走后,我才真的爱上你

    你走后,我才真的爱上你你走后,我才真的爱上你

  • 新一代金融神话Filecoin[通俗易懂]

    新一代金融神话Filecoin[通俗易懂]Filecoin是区块链史上耗时最短的ICO融资项目,受到了DCG集团、文克莱沃斯兄弟基金会、联合广场风投、AndersonHollotz基金和红杉资本等投资巨头的青睐。储存即收益,Filecoin与BTC的工作证明是不同的。filecoin只需要提供存储空间和宽带,就可以满足获取身份证明的需求。因此,Filecoin可以从根本上提高人类的效率,是一种真正的共享经济,它可以极大地推动存储资源的使用方式。由于Filecoin是基于强大的IPFS协议,并且由于IPFS的大量应用,Filecoin作为IPFS

  • Canny边缘检测

    Canny边缘检测Canny边缘检测是一种非常流行的边缘检测算法,是JohnCanny在1986年提出的。它是一个多阶段的算法,即由多个步骤构成。1.图像降噪2.计算图像梯度3.非极大值抑制4.阈值筛选我们就事后诸葛亮,分析下这个步骤的缘由。首先,图像降噪。我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号