跟我学Makefile(二)

跟我学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日

相关文章

  • python遍历数组的三种方法

    Python遍历数组的三种方法 在Python中,遍历数组是日常编程中必须操作之一。本文将介绍三种遍历数组的方法,分别为 for 循环、while 循环和 numpy.nditer() 方法。 1. for循环 for循环是Python中最基础的循环方式,同样适用于Python中的数组遍历。语法如下: for element in array: # do s…

    其他 2023年3月29日
    00
  • windows系统内存优化的九个小技巧

    Windows系统内存优化的九个小技巧 Windows系统内存优化是提高计算机性能和响应速度的重要步骤。下面是九个小技巧,可以帮助你优化Windows系统的内存使用。 1. 关闭不必要的后台程序 关闭不必要的后台程序可以释放内存资源,提高系统性能。通过以下步骤关闭后台程序: 在任务栏上右键单击不需要的程序图标。 选择“退出”或“关闭”选项。 示例说明:关闭不…

    other 2023年8月1日
    00
  • Android 自定义View步骤

    下面是自定义View的完整攻略: 一、思路和准备 在自定义View之前,我们需要先明确自己的需求。根据需求,我们可以考虑使用已有的View来实现,如果已有的View不能满足我们的需求,则需要自己来实现一个自定义View。 然后我们需要对要实现的自定义View进行分析,考虑需要绘制哪些内容、需要支持哪些属性等,制定好自己的计划。 接下来,我们需要准备好一些工具…

    other 2023年6月25日
    00
  • js中哈希表的几种用法总结

    下面是“js中哈希表的几种用法总结”的完整攻略,包括哈希表的定义、几种用法和两个示例说明。 哈希表的定义 哈希表是一种数据结构,它将键映射到值。哈希表通常用于实现关联数组、集合和映射等数据结构。在哈希表中,键和值是一一对应的,每个键都对应一个唯一的值。 几种用法 1. 创建哈希表 在 JavaScript 中,可以使用对象字面量来创建哈希表。例如: cons…

    other 2023年5月5日
    00
  • socket.io与pm2(cluster)集群搭配的解决方案

    下面是关于“socket.io与pm2(cluster)集群搭配的解决方案”的完整攻略。 安装pm2和socket.io 首先需要安装pm2和socket.io。可以使用以下命令行进行安装: npm install pm2 socket.io 安装完成后,确保在项目中正确引入了pm2和socket.io。 集群模式的配置 在使用pm2时,可以通过配置文件来配…

    other 2023年6月27日
    00
  • python3实现UDP协议的服务器和客户端

    下面是“Python3实现UDP协议的服务器和客户端”的完整攻略。 什么是UDP协议 UDP是用户数据报协议(User Datagram Protocol)的缩写,是一种无连接协议,属于OSI模型中的运输层。UDP协议简单、快速,适用于实时性要求较高、数据小、数据丢失后可以容忍的情况下使用。 UDP服务器和客户端的实现 UDP服务器 步骤1:导入模块和创建套…

    other 2023年6月25日
    00
  • 局域网共享常见问题解决汇集

    局域网共享常见问题解决汇集 在局域网中共享文件和打印机是很常见的需求。然而,在实际使用中我们可能会遇到各种问题,例如连接不上、速度慢、权限不足等等。本文将介绍几种常见的问题及其解决方法。 问题1:连接不上共享文件夹 症状 当尝试连接共享文件夹时,可能会弹出错误消息,显示无法连接到网络位置。这可能是由于网络连接问题或共享设置问题导致的。 解决方法 确保电脑已经…

    other 2023年6月27日
    00
  • 详解android adb常见用法

    详解Android ADB常见用法 ADB(Android Debug Bridge)是Android开发工具包(SDK)中的一个命令行工具,用于与连接的Android设备进行通信和调试。以下是ADB的常见用法及示例说明: 查看已连接设备列表 使用以下命令可以查看当前连接的Android设备列表: adb devices 示例输出: List of devi…

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