跟我学Makefile(二)

yizhihongxing

跟我学Makefile(二)

在上一篇跟我学Makefile中,我们学习了一些基础的Makefile语法和命令。在本文中,我们将继续深入了解如何使用Makefile自动化构建我们的代码。

变量

Makefile支持定义变量,可以提高代码的复用性和可维护性。变量可以用于定义命令、文件列表等。

变量的定义格式是变量名 = 值。例如:

CC = gcc
CFLAGS = -Wall -O2

可以用$()${}使用变量。例如:

$(CC) $(CFLAGS) -o main main.c

函数

Makefile支持多种内置函数,可以用于字符串操作、文件操作等。

一些常用函数:

  • shell: 执行shell命令并返回结果。

  • foreach: 遍历一个列表并执行命令。

  • wildcard: 列出符合某种模式的文件列表。

  • notdir: 返回去掉目录部分的文件名。

  • subst: 用一个字符串替换另一个字符串。

  • strip: 去掉字符串中的空格。

  • patsubst: 将符合某种模式的文件名替换为另一种模式。

我们可以用函数来定义变量、执行命令等。例如:

SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))

target: $(OBJS)
    $(CC) $(CFLAGS) -o target $(OBJS)

命令

在Makefile中可以定义一组命令,用于构建、清理代码等。一个命令通常包括若干行shell命令。

命令的格式是:

target: dependencies
    command

其中target是一个目标,dependencies是依赖项,command是命令。例如:

target: a.o b.o
    $(CC) $(CFLAGS) -o target a.o b.o

Makefile会自动根据依赖关系确定构建顺序。

实战

我们来看一个示例,用Makefile编译一个C程序,并支持单元测试。

CC = gcc
CFLAGS = -Wall -O2
LDFLAGS = -lm
TEST_FLAGS = -lcunit

SRCS = main.c math.c
OBJS = $(patsubst %.c, %.o, $(SRCS))

test: test_math
    ./test_math

test_math: math.o test_math.c
    $(CC) $(CFLAGS) $(TEST_FLAGS) -o test_math math.o test_math.c

$(OBJS): $(SRCS)
    $(CC) $(CFLAGS) -c $(SRCS)

clean:
    rm -f $(OBJS) test_math

在这个Makefile中,我们定义了四个目标:

  • test: 运行单元测试。

  • test_math: 编译单元测试程序。

  • $(OBJS): 编译目标程序。

  • clean: 清理编译产生的文件。

test_math依赖于math.otest_math.c,执行命令来构建单元测试程序。

$(OBJS)依赖于$(SRCS),执行命令来编译目标程序。

clean只是执行命令清理编译产生的文件。

我们可以使用make命令来构建代码和运行单元测试。

总结

本文介绍了Makefile中的变量、函数和命令以及如何通过它们来自动化构建代码。通过Makefile可以实现自动化、可重复、可维护的代码构建流程,提高代码质量和开发效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:跟我学Makefile(二) - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • xp系统c盘空间越来越小怎么办? C盘空间不足怎么清理(五种解决方法)

    XP系统C盘空间越来越小怎么办? 如果你的XP系统的C盘空间越来越小,可能会导致系统运行缓慢或无法正常工作。以下是五种解决方法,可以帮助你清理C盘空间。 方法一:清理临时文件 XP系统会在C盘上存储大量的临时文件,这些文件可能占据了大量的空间。你可以使用以下步骤清理临时文件: 打开\”开始\”菜单,选择\”运行\”。 输入\”%temp%\”并按下回车键,这…

    other 2023年8月1日
    00
  • Java 8实现任意参数的单链表

    在Java中实现任意参数的单链表涉及以下几个步骤: 1. 定义一个节点类 首先我们需要定义一个节点类,节点类保存节点的值(value)和指向下一个节点的指针(next)。 class Node<T> { T value; Node<T> next; public Node(T value) { this.value = value; …

    other 2023年6月27日
    00
  • 真正的获取客户端真实IP地址及利弊分析

    真正的获取客户端真实IP地址及利弊分析攻略 获取客户端真实IP地址对于网络应用程序来说是非常重要的,它可以用于识别用户、进行访问控制、统计分析等。然而,由于网络架构的复杂性和安全性的考虑,获取真实IP地址并不总是一件容易的事情。本攻略将详细介绍如何真正获取客户端真实IP地址,并分析其中的利弊。 1. 使用HTTP头字段 HTTP头字段中的X-Forwarde…

    other 2023年7月30日
    00
  • android递归压缩上传多张图片到七牛的实例代码

    针对这个话题,我们来一步步详细讲解下面的内容: 什么是递归压缩上传? 递归压缩上传就是将需要上传的多张图片按照递归的方式一张张压缩并上传到云存储服务中。这种方式可以避免手机内存不足的问题,并且可以节省上传时间和流量。 如何使用七牛云存储服务? 首先,要使用七牛云存储服务,我们需要注册账号,创建一个存储空间,并且在Android项目中导入七牛SDK。 depe…

    other 2023年6月27日
    00
  • SpringBoot+Vue+Flowable模拟实现请假审批流程

    下面是“SpringBoot+Vue+Flowable模拟实现请假审批流程”的完整攻略。 一、概述 本文介绍了如何使用SpringBoot、Vue以及Flowable框架实现一个完整的请假审批流程,包括: 数据库建表 后端接口编写 前端页面设计 流程图绘制与流程部署 请假申请与审批流程演示 二、数据库建表 本文的请假审批流程需要使用到两个表,分别是oa_le…

    other 2023年6月27日
    00
  • C#特性 匿名类型与隐式类型局部变量使用介绍

    匿名类型和隐式类型局部变量是C#语言中的特性。以下是一个完整的攻略,介绍了匿名类型和隐式类型局部变量的使用,包括两个示例说明。 匿名类型的使用 匿名类型是一种临时创建的只读类型,用于存储一组相关的属性值。它在编译时动态生成,并且没有明确的类型名称。以下是匿名类型的使用示例: var person = new { Name = \"John\&quo…

    other 2023年8月15日
    00
  • riched32.dllriched20.dllmsftedit.dll解析

    riched32.dll、riched20.dll、msftedit.dll解析 在 Windows 操作系统中,有三个重要的 DLL 库:riched32.dll、riched20.dll、msftedit.dll,它们在文本控件的处理上都具有重要的作用。本文将对这三个库进行解析。 riched32.dll riched32.dll 是 Rich Edit…

    其他 2023年3月28日
    00
  • Mybatis select记录封装的实现

    “Mybatis select记录封装的实现”指的是在Mybatis框架中如何将从数据库中查询到的记录封装成Java对象。下面是一个完整攻略: 1. Mybatis resultMap Mybatis提供了resultMap来将查询结果映射成Java对象。在mapper文件中定义resultMap: <resultMap id="userRe…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部