首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Makefile:在配方中重用模式规则的%的值

基础概念

Makefile 是一个用于自动化编译和构建软件项目的文件。它使用规则来定义如何从源文件生成目标文件。模式规则是一种 Makefile 规则,它允许你定义一种模式,然后应用于多个文件。% 是一个通配符,代表任意长度的字符串。

相关优势

  • 简化 Makefile:通过模式规则,可以减少重复的规则定义,使 Makefile 更简洁易读。
  • 提高可维护性:当需要修改构建逻辑时,只需修改模式规则,而不需要在多个地方进行修改。
  • 灵活性:模式规则可以应用于多种文件类型,提高了构建系统的灵活性。

类型

模式规则主要有以下几种类型:

  1. 隐含规则:Makefile 中预定义的一些规则,如编译 C 文件为对象文件。
  2. 自定义模式规则:用户根据项目需求自定义的模式规则。

应用场景

假设你有一个项目,包含多个 C 源文件,每个源文件都需要编译成对象文件,然后链接成最终的可执行文件。你可以使用模式规则来简化这个过程。

示例

假设有以下目录结构:

代码语言:txt
复制
project/
├── src/
│   ├── main.c
│   ├── module1.c
│   └── module2.c
├── obj/
│   ├── main.o
│   ├── module1.o
│   └── module2.o
└── Makefile

Makefile 内容如下:

代码语言:txt
复制
# 定义源文件和目标文件的路径
SRC_DIR = src
OBJ_DIR = obj
TARGET = myprogram

# 获取所有源文件
SRC_FILES = $(wildcard $(SRC_DIR)/*.c)
OBJ_FILES = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRC_FILES))

# 模式规则:编译 C 文件为对象文件
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
    $(CC) -c $< -o $@

# 创建目标目录
$(OBJ_DIR):
    mkdir -p $(OBJ_DIR)

# 链接对象文件生成可执行文件
$(TARGET): $(OBJ_FILES)
    $(CC) $^ -o $@

# 清理生成的文件
clean:
    rm -rf $(OBJ_DIR) $(TARGET)

解释

  1. 模式规则$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR) 定义了一个模式规则,表示从 $(SRC_DIR) 目录下的任意 .c 文件生成 $(OBJ_DIR) 目录下的对应 .o 文件。
  2. 通配符% 代表任意长度的字符串,因此这个规则可以应用于所有 .c 文件。
  3. 依赖关系$< 表示第一个依赖文件,$^ 表示所有依赖文件。
  4. 创建目录$(OBJ_DIR): 规则确保目标目录存在。

遇到的问题及解决方法

问题:模式规则没有生效

原因:可能是由于 Makefile 中的其他规则优先级更高,或者模式规则的依赖关系没有正确设置。

解决方法

  1. 确保模式规则的依赖关系正确。
  2. 使用 override 关键字确保模式规则优先级最高。
代码语言:txt
复制
override $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
    $(CC) -c $< -o $@
  1. 检查是否有其他规则覆盖了模式规则。

通过以上方法,可以有效地使用 Makefile 中的模式规则来简化构建过程,并解决相关问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

javascript各种类型数据表达式中转换成布尔型规则总结

javascript中有5种数据类型,分别为:Undefined、Boolean、Object、Number、String,这几类型数据,当他们处在表达式里面的时候,js解析器会自动将其转换成布尔来决定当前条件究竟符合哪个逻辑分支...(当然,我们也可以手动通过调用Boolean(var)方法来转换),从而决定执行那个方法体代码,那把这几种类型转换成布尔型时,究竟是遵循怎样规则呢?...数据类型 转换成true取值 转换成false取值 Undefined 无 undefined Boolean true false Object 非null时都为true null Number...非0和NaN时都为true 0和NaN String 非空字符串 ""(空字符串)   上述就是js中转换规则开发时候,一定要认真分析变量可能取值及转换,如果预料中得到true却得到false

37520
  • makefile 基础、进阶及常用 makefile

    命令:通过执行该命令由依赖文件生成目标 makefile 工作原理 1、若想生成目标,检查规则依赖条件是否存在,如不存在,则寻找是否有规则用来生成该依赖文件 2、检查规则目标是否需要更新,必须先检查它所有依赖...$@:命令中使用,表示规则目标 $<:命令中使用,表示规则第一个条件 $^:命令中使用,表示规则所有条件,组成一个列表,以空格隔开,如果这个列表中有重复项则消除重复项。...执行 make 命令后,可以达到同样效果。 makefile 模式规则 再分析一下上面的 makefile 代码,对于每个要生成 .o 文件,我们都要给他写一条规则,如果有很多怎么办?...难道要一条一条写吗?当然不会,makefile 提供了一种模式规则,使用 % 符号来匹配任意字符串达到通作用,先来看改造后代码,然后我们来分析其执行流程。...$@ 规则 %.c % ,取决于目标 %.o,而此时 %.o 中 % 是上面生成 app 所需 main.o,所以解释以后代码相当于下面这样: main.o:main.c gcc

    40610

    实战Makefile前,该知道那些知识?

    也许Makefile时候,都要养成这样一个习惯,一般风格都是: clean: rm $(obj) *.o 更为稳健做法是(原因:如果当前目录存在clean文件,该命令会执行失败),解决办法...:clean从来都是放 文件最后。...书写规则 显示规则(@字符): 当用@字符命令前面时,那么执行这条命令时候,这条命令不会显示出来。...这些变量可以让我们更加快速完成Makefile编写,其中自动变量只能在规则命令使用,常用自动变量如下: $@:规则目标 $<:规则第一个依赖文件 $^:规则所有依赖文件 CC...模式规则实在目标及依赖中使用%来匹配对应文件,我们依旧使用上面的例子,采用模式规则格式,如下: CC = gcc OBJ = main.o add.o output: $(OBJ) $(CC)

    48520

    Linux 下make命令与Makefile

    Make命令参数 -f:指定“makefile”文件; -i:忽略命令执行返回出错信息; -s:沉默模式执行之前不输出相应命令行信息; -r:禁止使用build-in规则; -n...你可以在你makefile中改变这些变量,或是make命令行中传入这些,或是在你环境变量中设置这些,无论怎么样,只要设置了这些特定变量,那么其就会对隐含规则起作用。...一个模式规则就好像一个一般规则,只是规则中,目标的定义需要有% 字符。% 意思是表示一个或多个任意字符。依赖目标中同样可以使用% ,只是依赖目标中% 取值,取决于其目标。...模式规则介绍 模式规则中,至少规则目标定义中要包含%,否则,就是一般规则。目标中% 定义表示对文件名匹配,%表示长度任意非空字符串。...如果%定义目标中,那么,目标中%决定了依赖目标中%,也就是说,目标中模式%决定了依赖目标中%样子。

    10.2K20

    Linux嵌入式开发——Makefile基本语法

    =” 2.4、变量追加“+=” 三、Makefile 模式规则 四、Makefile 自动化变量 五、Makefile 伪目标 Linux嵌入式开发——Makefile基本语法 接下来我们来详细介绍一下基本...答案是肯定,不过我们需要引入我们接下来要介绍Makefile 模式规则了。好啦,就让我们开始吧!!!...: main.c gcc -c main.c input.o: input.c gcc -c input.c calcu.o: calcu.c gcc -c calcu.c 其实我们所谓模式规则就是目标中引入了一个通配符...四、Makefile 自动化变量 自动化变量:这种变量会把模式中所定义一系列文件自动挨个取出,直至所有的符合模式文件都取完,自动化变量只应该出现在规则命令中。...我们来具体看一看都有哪些自动化变量: 自动化变量 描述 $@ 规则目标集合,模式规则中,如果有多个目标的话,“$@”表示匹配模式中定义目标集合。

    1.5K20

    Makefile学习1

    但是还有一种情况:Makefile规则中,一般不会把头文件添加到目标依赖中。...应用: 立即展开变量一般用在规则目标、目标依赖中。make解析Makefile阶段,需要这些变量有确切来构建依赖关系树。...延迟展开变量一般用在规则命令行中,这些变量make编译过程中被引用到才会展开,获得其实际。 自动变量 Makefile中,大家经常会见到类似 @、 ^、$<这种类型变量。...Makefile时可能会遇到,比如: $%:当规则目标是一个静态库文件时,$%代表静态库一个成员名 $+:类似$^,但是保留了依赖文件中重复出现文件 $*:模式匹配和静态模式规则中,代表目标模式中...比如hello.c,当匹配模式为%.c时,$*表示hello $(@D):表示目标文件目录部分 $(@F):表示目标文件文件名部分 $(*D):模式匹配中,表示目标模式中%目录部分 $(*F):

    38510

    深度刨析makefile

    变量赋值 makefile变量类似于c语言中宏定义,执行时候会用变量后面的去替换变量所在位置。...③ 变量替换 我们可以对变量进行替换,主要有如下两种方法 (2)自动化变量与模式变量 ① 自动化变量 自动化变量是指 makefile 根据模式规则自动推导变量,这类变量只能在命令中使用。...下面是常用自动化变量列表 自动化变量 说明 $@ 代表目标文件,模式规则中, $@ 就是目标中模式定义相匹配目标文件集合 $< 第一个依赖文件,如果依赖是以模式 % 定义,那么 $< 代表符合模式一系列文件集...(5)模式规则 ① 什么是模式 模式规则也就是说规则中存在模式匹配字符 % ,并且是一定要存在 % ,该字符用于对文件名进行匹配。...模式匹配字符 % 我们 makefile 字符匹配章节已经介绍过了。

    11310

    Linux学习笔记(二)、常用指令(下)

    = 4.1、=赋值 使用=在给变量赋值时,不一定使用已经定义好,也可以使用后面定义,变量真实为其所引用变量最后一次有效。...6、Makefile模式规则 在有多个.c文件需要生成.o文件时,可以通过模式规则将所有的.c文件变为对应.o文件。...模式规则中,至少规则目标定义中包含“%”,否则就是一般规则,目标中“%”表示对文件名匹配,“%”表示任意长度非空字符串,比如“%.c”就是代表所有以.c结尾文件。...自动化变量将模式中所定义一系列文件自动逐个取出,直到所有的符合模式文件都取完,自动化变量只应该出现在规则命令中。 ? ? 最终makefile变为: ?...工作目标创建一个与执行指令同名文件时,执行指令并不会执行,因为规则没有依赖文件,所以目标认为是最新

    2.4K21

    Makefile经典教程(掌握这些足够)

    二、变量中变量 定义变量时,我们可以使用其它变量来构造变量Makefile中有两种方式来在用变量定义变量。...(CFLAGS)是什么,prog目标,以及其所引发所有规则中(prog.o foo.o bar.o规则),$(CFLAGS)都是“-g” 九、模式变量 GNU...你可以在你makefile中改变这些变量,或是make命令行中传入这些,或是在你环境变量中设置这些,无论怎么样,只要设置了这些特定变量,那么其就会对隐含规则起作用。...五、定义模式规则 你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般规则,只是规则中,目标的定义需要有"%"字符。"%"意思是表示一个或多个任意字符。...如果"%"定义目标中,那么,目标中"%"决定了依赖目标中"%",也就是说,目标中模式"%"决定了依赖目标中"%"样子。

    2.7K20

    Linux makefile 教程 非常详细,且易懂

    二、变量中变量 定义变量时,我们可以使用其它变量来构造变量Makefile中有两种方式来在用变量定义变量。...CFLAGS)是什么,prog目标,以及其所引发所有规则中(prog.o foo.o bar.o规则),(CFLAGS)都是“-g” 九、模式变量 GNUmake中,还支持模式变量(Pattern-specific...你可以在你makefile中改变这些变量,或是make命令行中传入这些,或是在你环境变量中设置这些,无论怎么样,只要设置了这些特定变量,那么其就会对隐含规则起作用。...五、定义模式规则 你可以使用模式规则来定义一个隐含规则。一个模式规则就好像一个一般规则,只是规则中,目标的定义需要有”%”字符。”%”意思是表示一个或多个任意字符。...如果”%”定义目标中,那么,目标中”%”决定了依赖目标中”%”,也就是说,目标中模式”%”决定了依赖目标中”%”样子。

    4.3K20

    Makefile 使用总结

    模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义集合。 $%     仅当目标是函数库文件中,表示规则目标成员名。...$*     这个变量表示目标模式中"%"及其之前部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"就是"dir/a.foo"。...这个特性是GNU make,很有可能不兼容于其它版本make,所以,你应该尽量避免使用"$*",除非是隐含规则或是静态模式中。...在上述所列出来自动量变量中。四个变量($@、$<、$%、$*)扩展时只会有一个文件,而另三个是一个文件列表。...还得要注意是,这些变量只使用在规则命令中,而且一般都是"显式规则"和"静态模式规则"(参见前面"书写规则"一章)。其隐含规则中并没有意义。 1.

    3.6K30

    Makefile从入门到上手

    Makefile 中,目标和依赖是通过规则(rule)来表达makefile 依赖是从上至下,换句话说就是目标文件是第一句里目标, 如果不满足执行依赖,就会继续向下执行。...、三个自动变量和模式规则 ①、三个自动变量 $@ # 规则命令中,表示规则目标。...$^ # 规则命令中,表示所有依赖条件。组成一个列表,以空格隔开,如果这个列表中有重复项,则去重 $< # 规则命令中,表示第一个依赖条件。... Makefile 中有两种变量,一种称为即时变量(简单变量),另一种称为延时变量 即时变量(简单变量) A := xxx # A 即刻确定,定义时即确定 延时变量 B = xxx...可以看到 A 为空,B 为 abc,因为 A 为即时变量,定义时即确定,所以为空 修改 Makefile 将 C 赋值放在最后: A := $(C) B = $(C) #C = abc

    39330

    全网最牛Linux内核Makefile系统文件详解(纯文字代码)

    一、Makefile规则 讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile规则。 target ... : prerequisites ......其与C/C++所不同是,你可以Makefile中改变其Makefile中,变量可以使用在“目标”,“依赖目标”,“命令”或是Makefile其它部分中。...二、变量中变量 定义变量时,我们可以使用其它变量来构造变量,Makefile中有两种方式来在用变量定义变量。...(CFLAGS)是什么,prog目标,以及其所引发所有规则中(prog.o foo.o bar.o规则),$(CFLAGS)都是“-g” 九、模式变量 GNUmake中,还支持模式变量...模式变量好处就是,我们可以给定一种“模式”,可以把变量定义符合这种模式所有目标上。

    3.2K20

    makefile

    (2)变量定义:Makefile中可以定义一系列变量,变量一般都是字符串,当Makefile被执行时,变量会被扩展到相应引用位置上。...模式规则中,如果有多个目标,那么," $@ " 就是匹配于目标中模式定义集合。 $% ——仅当目标是函数库文件中,表示规则目标成员名。...这种规则更加通用,因为可以利用模式规则定义更加复杂依赖性规则。...模式规则看起来非常类似于正则规则,但在目标名称前面多了一个 % 号,同时可用来定义目标和依赖文件之间关系,例如下面的模式规则定义了如何将任意一个 X.c 文件转换为 X.o 文件: %.c:%.o...2.4 Makefile函数 Makefile中可以使用函数来处理变量,从而让命令或规则更为灵活和具有智能,函数调用,很像变量使用,也是以“$”来标识,函数调用后,函数返回可以当做变量来使用

    2K00

    Linux 开发 | 学习 Makefile

    静态模式 对应多个目标对象,构建每个对象对应名称依赖关系规则。...name.xxxx (Makefile中 $ 有特殊含义,如果要表示它字面意思需要写两个 $,所以 Makefile四个 $ 传给Shell变成两个 $,而两个 $ Shell中表示当前进程...=, +=, = 和 := 差别 ?= 如果没有被赋值过就赋予等号后面的 += 添加等号后面的 = 最基本赋值(最后才展开) make会将整个makefile展开后,再决定变量。...也就是说,变量展开是最后, 使我们可以最后才指定变量。 x = XXX y = $(x) x = YYY 在上例中,y将会是 YYY ,而不是 XXX。...:= 是覆盖之前(类似C中 = ) 变量决定于它在makefile位置,而不是整个makefile展开后最终值。

    5.4K10

    Linux学习-开发工具使用

    “往下数”n行文字 「p」:将缓冲区内字符贴到光标所在位置 //注意:y相关操作与“p”能完成复制粘贴 替换: 「r」:输入需要改成字符,替换光标所在处字符 「R」:切换成替换模式,输入可以替换光标所到之处字符...,每次列10行 list/l 函数名:列出某个函数源代码 info break/ info b :查看断点信息 print/p:打印表达式,通过表达式可以修改变量或者调用函数 display...示图: 修改: set var:修改变量 断点: break/b 行号:某一行设置断点 break 函数名:某个函数开头设置断点 delete breakpoints/d:删除所有断点...1、背景及概念 一个工程中源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂功能操作...,如果找到则再根据那一个规则生成依赖文件 这就是整个make依赖性,make会一层又一层地去找文件依赖关系,直到最终编译出第一个目标文件 找寻的过程中,如果出现错误,比如最后被依赖文件找不到

    3.4K20

    Makefile 入门教程

    基本概念 目标 (Targets): Makefile 中,目标是要生成文件或执行操作名称。目标可以是文件名,也可以是伪目标,用于执行特定任务而不生成文件。...依赖项 (Dependencies):依赖项是与目标相关联文件或其他目标,它们目标生成之前必须存在或已经生成。 规则 (Rules):规则定义了如何生成目标以及生成目标所需命令。...命令 (Commands):命令是在生成目标时要执行操作。命令必须以 Tab 键开头。 变量 (Variables):变量用于存储文本或命令,并可以整个 Makefile 中重复使用。...Makefile 语法 一个基本 Makefile 规则语法如下: target: dependencies command target:要生成目标的名称。...这些函数可以 Makefile 中用于各种目的,例如文件操作、文本处理和条件判断。 5.2 自动化依赖关系生成 通常,Makefile依赖关系需要手动维护。

    41820

    linux: Makefile编写技巧温故

    系统运维中,Makefile 是一种强大工具,用于管理和自动化各种任务。它能够有效地处理任务执行、文件生成、系统管理等操作。...本文将介绍一些常见Makefile编写技巧,帮助运维工程师更好地利用Makefile来自动化任务。 1. 基础语法 Makefile 由一系列规则组成,每条规则定义了一个目标及其依赖和生成方式。...=)用于变量未定义时进行赋值。这在需要提供默认时非常有用。 makefile PLAYBOOK ?= site.yml INVENTORY ?...高效自动化任务 通过使用模式规则,可以简化重复规则定义,提高Makefile可维护性。.../scripts/$* all: $(SCRIPTS:.sh=.run) clean: rm -rf /tmp/deployment 在这个例子中,%.run 是一个模式规则,匹配所有以

    12710
    领券