0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【Makefile】函数介绍

_light 来源:_light 作者:_light 2022-11-18 10:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

函数格式及示例

在 Makefile 中调用函数的方法跟变量的使用类似,以“()”或“{}”符号包含函数

名和参数,具体语法如下:

$(函数名 参数)
# 或者使用花括号
${函数名 参数}

下面以常用的 notdir、 patsubst、 wildcard 函数为例进行讲解,并且示例中都是我们后面 Makefile 中使用到的内容.

notdir 函数

notdir 函数用于去除文件路径中的目录部分。它的格式如下:

$(notdir 文件名)

例如输入参数 ./sources/func.c,函数执行后的输出为 func.c,也就是说它会把输入

中的 ./sources/ 路径部分去掉,保留文件名。使用范例如下:

# 把路径中的“./sources/”部分去掉,输出为: hello_func.c
$(notdir ./sources/hello_func.c)

wildcard 函数

wildcard 函数用于获取文件列表,并使用空格分隔开。它的格式如下:

$(wildcard 匹配规则)

例如函数调用 $(wildcard *.c),函数执行后会把当前目录的所有 .c 文件列出。假设在 sources目录下有 func.c、main.c ,使用范例如下:

$(wildcard sources/*.c)
  # 函数的输出为:
 sources/func.c sources/main.c

patsubst 函数

patsubst 函数功能为模式字符串替换。它的格式如下:

$(patsubst 匹配规则, 替换规则, 输入的字符串)

当输入的字符串符合匹配规则,那么使用替换规则来替换字符串,当匹配规则中有 % 号时,

替换规则也可以例程 % 号来提取 % 匹配的内容加入到最后替换的字符串中。有点抽象,请

直接阅读以下示例:

$(patsubst %.c, build_dir/%.o, hello_main.c )
 # 函数的输出为:
 build_dir/hello_main.o
 # 执行如下函数
 $(patsubst %.c, build_dir/%.o, hello_main.xxx )
 # 由于 hello_main.xxx 不符合匹配规则"%.c",所以函数没有输出

第一个函数调用中,由于 hello_main.c 符合 %.c 的匹配规则( **% 在 Makefile 中的类似于 * 通

配符** ),而且 %hello_main.c 中提取出了 hello_main 字符,把这部分内容放到替换规

build_dir/%.o% 号中,所以最终的输出为 build_dir/hello_main.o

第二个函数调用中,由于由于 hello_main.xxx 不符合 %.c 的匹配规则,.xxx.c

不上,所以不会进行替换,函数直接返回空的内容。

示例

假如我们有以下目录结构:

.
├── includes
│   ├── add_one.h
│   └── func.h
├── makefile
└── sources
    ├── add_one.c
    ├── func.c
    └── main.c

文件内容如下:

add_one.h

int add_one(int x, int y);

func.h

void func(void);

add_one.c

int add_one(int x, int y)
{
    return x + y;
}

func.c

#include "stdio.h"

void func(void)
{
    printf("This is %s file !", __FILE__);
}

main.c

#include "stdio.h"
#include "add_one.h"
#include "func.h"

int main()
{
    int x = 9, y = 8;
    int sum = 0;

    sum = add_one(x, y);

    printf("%d + %d = %d\\n", x, y, sum);
    func();

    return 0;
}

如果我们不借助makefile的话,直接运行指令:

gcc -o main.exe .\\sources\\main.c .\\sources\\func.c .\\sources\\add_one.c -I .\\includes\\

即可完成编译

以后我们的源文件 .c 增多,目录结构更复杂,此时借助 makefile 是最方便的

使用makefile

# 生成的可执行文件名
TARGET = main.exe
# 编译器
CC = gcc

#存放中间文件的路径
BUILD_DIR = build
#存放源文件的文件夹
SRC_DIR = sources
#存放头文件的文件夹
INC_DIR = includes 

# 源文件
SRCS = $(wildcard $(SRC_DIR)/*.c)  #列出 sources 目录下的文件
# 目标文件(*.o)
OBJS = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRCS)))
# 头文件
DEPS = $(wildcard $(INC_DIR)/*.h)

# #################
# 编译选项
# #################
# 指定头文件的路径
CFLAGS = $(patsubst %, -I%, $(INC_DIR))
# 输出编译警告
COPTION = -Wall   

# 生成目标文件
$(BUILD_DIR)/$(TARGET): $(OBJS)
	$(CC) -o $@ $^ $(CFLAGS) $(COPTION)

#*.o 文件的生成规则
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(DEPS)
	@mkdir -p $(BUILD_DIR)
	$(CC) -o $@ -c $< $(CFLAGS) $(COPTION)

# 运行.exe
run:
	@$(BUILD_DIR)/$(TARGET)

# 删除生成的文件
clean:
	rm -rf $(BUILD_DIR)
  1. 编译
make
  1. 运行
make run
  1. 删除文件
make clean

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66829
  • Makefile
    +关注

    关注

    1

    文章

    125

    浏览量

    20200
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    关于Makefile自动生成-autotools的使用

    Makefile并非日常任务,但遇见需要构建大型软件项目时,利用工具自动生成Makefile就显得尤为关键。接下来,我们将重点介绍一款自动化构建工具——Autoto
    的头像 发表于 07-25 15:50 2032次阅读
    关于<b class='flag-5'>Makefile</b>自动生成-autotools的使用

    Makefile函数和实例分析

    首发平台:微信公众号baiwenkejiARM裸机1期加强版视频课程配套WiKi第9课第7节Makefile函数和第8节Makefile实例。发现没有?wiki.100ask.org 也有变化:多了
    发表于 04-25 11:03

    Makefile编写

    Makefile编写 Makefile编写在很多时候有着很大的作用,那么我们该如何编写呢,下面大家一起来了解一下关于Makefile编写的内容。1. make和Makefile
    发表于 11-02 15:59

    Makefile中怎么使用函数来处理变量?

    Makefile中怎么使用函数来处理变量?make具有什么参数?使用make有什么注意事项?
    发表于 04-28 07:04

    Makefile中文教程 -下载

    Makefile中文教程,免费下载哦。
    发表于 03-25 08:57 68次下载

    C语言入门教程-makefile

    makefile 重复键入上一节的gcc命令很是麻烦,尤其是当您要不断修改的代码,且使用了好几个函数库的时候。make工具解决了这个问题。您可以用下面的makefile代替前面的一串编
    发表于 07-29 11:20 991次阅读

    驾驭Makefile

    驾驭Makefile在网上你能找到很多关于Makefile的学习资料,但绝大部分给你的只是一个知识点,与将Makefile运用到项目中(尤其是大型项目)的差距非常的大。因为,将Makefile
    发表于 01-05 17:05 9次下载

    关于Linux 2.6内核Makefile的分析

    介绍文章都是基于2.4内核的,可以说关于2.6内核Makefile相关的文章凤毛麟角,笔者抽时间完成了这篇分析文章,让读者迅速熟悉Linux最新Makefile体系,从而加深对内核的理解,同时也希望能
    发表于 11-02 10:12 1次下载

    linux makefile教程

     什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile
    发表于 11-12 09:11 1.6w次阅读

    makefile的基本语法

     在Makefile中,最重要的三个概念是:目标(target)、依赖关系(dependency)和命令(command)。目标是指要干什么,即运行make后生成什么;依赖是指明目标所依赖的其他目标;命令则告诉make如何生成目标,这三个概念是通过Makefile中的规则
    发表于 11-12 10:15 1.2w次阅读

    Makefile是什么?Makefile工作原理是怎样的?Makefile经典教程免费下载

    Makefile的重要性 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件
    发表于 09-12 17:19 0次下载
    <b class='flag-5'>Makefile</b>是什么?<b class='flag-5'>Makefile</b>工作原理是怎样的?<b class='flag-5'>Makefile</b>经典教程免费下载

    Linux关于Makefile的用法介绍

    Make可以从一个名为Makefile的文件中获得如何构建程序的知识,该文件列出了每个非源文件以及如何从其他文件计算它。当你编写一个程序时,你应该为它编写一个Makefile文件,这样就可以使用Make来编译和安装这个程序。
    发表于 12-24 10:36 2098次阅读

    Makefile的项目模板免费下载

    本文档的主要内容详细介绍的是Makefile的项目模板免费下载 可根据项目名称修改。
    发表于 06-12 08:00 11次下载
    <b class='flag-5'>Makefile</b>的项目模板免费下载

    嵌入式中的Makefile应用

    文章目录一.Makefile 引入二. Makefile语法1.通配符2.假象目标3.变量三.Makefile函数四.实例本文主要总结一下嵌入式开发中的
    发表于 11-03 17:06 11次下载
    嵌入式中的<b class='flag-5'>Makefile</b>应用

    Makefile】简单实用的Makefile模板来了

    【Linux + Makefile】简单实用的Makefile模板来了
    的头像 发表于 08-31 12:46 2499次阅读
    【<b class='flag-5'>Makefile</b>】简单实用的<b class='flag-5'>Makefile</b>模板来了