在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建、编译、测试和部署。然而,编写高效的Makefile文件并不是一件容易的事情。在本文中,我们将讨论如何编写高效的Makefile文件,以提高我们的开发效率和产品质量


确定目标

在编写Makefile文件之前,我们需要明确我们的目标是什么。我们需要知道我们需要构建哪些文件,以及它们之间的依赖关系。为了确定目标,我们需要考虑以下问题:

  • 我们正在编译哪些文件?这些文件在哪里?
  • 这些文件之间有什么依赖关系?也就是说,哪些文件需要在哪些文件之前构建?
  • 我们需要定义哪些规则来构建这些文件?这些规则应该包括什么?

一旦我们确定了这些问题,我们就可以编写Makefile文件并开始构建我们的项目。


使用变量

Makefile中的变量可以使我们的代码更加模块化和可维护。我们可以将常量放入变量中,以便在整个Makefile中重复使用。例如,我们可以将编译器的路径、编译器选项和库路径都放入变量中。此外,我们还可以在变量中存储其他有用的信息,例如项目名称、版本号等。通过使用变量,我们可以更轻松地管理我们的代码,并确保代码的一致性和可读性。

需要注意的是,变量名应该清晰明了,以便其他人可以轻松理解代码的意图,并提高我们的代码质量。

CC = gcc
CFLAGS = -Wall -O2
LIBS = -lm

使用自动变量

自动变量可以使我们在规则中引用目标和依赖关系,以及其他有用的信息。例如,$@代表目标文件名,$<代表第一个依赖文件名。这些自动变量可以使我们的Makefile文件更加简洁和易于维护。

此外,我们可以使用其他自动变量来进一步简化我们的Makefile。例如,$^代表所有依赖文件的列表,$?代表所有比目标文件更新的依赖文件列表。我们还可以使用通配符来匹配多个文件,例如*.c表示所有.c文件。


使用模式规则

使用模式规则可以使我们更加灵活地编写Makefile文件。它允许我们使用通配符来匹配文件名,并使用相同的规则来构建它们。例如,我们可以使用以下规则来编译所有的.c文件:

%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@

这个规则指定了一个目标模式%.o,表示任意以.o结尾的目标文件。它还指定了一个依赖模式%.c,表示与目标文件同名的.c源文件。最后,它使用$(CC)$(CFLAGS)变量来指定要使用的编译器和编译选项。

通过这个规则,我们可以轻松地编译所有的.c文件,而不需要为每个文件都编写一个单独的规则。


使用.PHONY规则

.PHONY规则可以使我们更加精确地指定Makefile文件中的目标。它告诉make命令,某个目标是一个伪目标,不是一个实际的文件名。例如,我们可以使用以下规则来定义.PHONY目标:

.PHONY: all clean

all: $(TARGET)

clean:
rm -rf $(OBJS) $(TARGET)

结论

Makefile文件是一种非常有用的工具,可以提高我们的开发效率。为了使我们的Makefile文件更加简洁、易于维护和灵活,可以通过一些技巧,包括使用变量、自动变量、模式规则和.PHONY规则。

除此之外,我们还需要关注一些其他的方面。比如说,我们可以考虑在Makefile文件中添加一些注释,以帮助其他人更好地理解我们的Makefile。

最后

为了方便其他设备和平台的小伙伴观看往期文章,链接奉上:

公众号搜索Let us Coding,或者扫描下方二维码,关注公众号,即可获取最新文章。

看完如果觉得有帮助,欢迎点赞、收藏关注

5 个编写高效 Makefile 文件的最佳实践的更多相关文章

  1. vue 单文件组件最佳实践

    vue 单文件组件最佳实践 生命周期 template <template> <section> <h1>vue single file components te ...

  2. ASP.NET Core文件压缩最佳实践

    前言 在微软官方文档中,未明确指出文件压缩功能的使用误区. 本文将对 ASP.NET Core 文件响应压缩的常见使用误区做出说明. 误区1:未使用 Brotil 压缩 几乎不需要任何额外的代价,Br ...

  3. 编写个makefile文件测试patsubst 的作用

    1 SRCS := $(wildcard *.c) 2 OBJS := $(patsubst %.c,%.o,$(SRCS) ) //把$(SRCS)中的文件.c全部换成.o文件 3 all: 4 @ ...

  4. POI读取文件的最佳实践

    POI是 Apache 旗下一款读写微软家文档声名显赫的类库.应该很多人在做报表的导出,或者创建 word 文档以及读取之类的都是用过 POI.POI 也的确对于这些操作带来很大的便利性.我最近做的一 ...

  5. 编写高性能Java代码的最佳实践

    博客地址: http://blog.csdn.net/dev_csdn/article/details/79033972

  6. 编写高效SQL最佳实践

    编写高效 SQL 语句的最佳实践 秦玮, 高级软件工程师, IBM 王广成, 软件工程师, IBM 王韵婷, 高级软件工程师, IBM 简介: 本文列举了一些在编写 SQL 查询语句时可能导致 DB2 ...

  7. 单文件夹下的C程序如何编写Makefile文件

    通过学习已经学会了GCC的一些基础的命令,以及如何将C语言源代码编译成可执行文件. 我们已经知道在linux环境下编译源码时,常会有以下三个步骤: ./configure make make clea ...

  8. [转]C++ 使用Makefile文件

    //*********list class.h**********class tdate {private:int month;int day;int year;public:tdate();tdat ...

  9. Makefile文件(DE1-soc软件实验”hello_word")

    DE1-soc软件实验”hello_word"中,hello_word此程序很好理解,那Makefile文件又如何理解呢? 所要完成的Makefile 文件描述了整个工程的编译.连接等规则. ...

  10. 如何快速编写大项目的Makefile文件

    在构建C++的后台服务时,经常需要自己来编写makefile文件,而如果没有合适的方法或模板时,编写makefile文件是一件很费时费力的事情.因此,为了帮助程序员高效准确的编写makefile文件, ...

随机推荐

  1. 狂神说Git学习笔记整理

    Git 版本控制 ​ 在开发过程中,项目会进行版本迭代,新版本会取代旧版本,但是我们不希望直接删除旧版本,所以就需要一个版本管理器来管理新旧版本,不然就是手动控制... 多人开发必须使用版本控制!!! ...

  2. 电子设备内幕:RAM和ROM小百科

    大家好,我是知微. 在智能手机出现之前,大家对RAM和ROM这两个词都没什么概念.如今很多手机在宣传的时候,都会标明有多大的RAM(运行内存)和ROM(存储空间),因为这在很大程度上影响手机的使用流畅 ...

  3. 5、mysql优化--索引使用情况、索引的结构

    避免索引失效 1). 全值匹配 ,对索引中所有列都指定具体值. 2). 最左前缀法则 如果索引了多列,要遵守最左前缀法则.指的是查询从索引的最左前列开始,并且不跳过索引中的列. 3). 范围查询右边的 ...

  4. pandas plot函数:数据可视化的快捷通道

    一般来说,我们先用pandas分析数据,然后用matplotlib之类的可视化库来显示分析结果.而pandas库中有一个强大的工具--plot函数,可以使数据可视化变得简单而高效. 1. plot 函 ...

  5. 机器学习从入门到放弃:卷积神经网络CNN(二)

    一.前言 通过上一篇文章,我们大概了解了卷积是什么,并且分析了为什么卷积能在图像识别上起到巨大的作用.接下来,废话不多话,我们自己尝试动手搭建一个简易的CNN网络. 二.准备工作 在开始的时候,我们首 ...

  6. Git: Host key verification failed(主机密钥验证失败)

    换了新电脑Y7000 10750H,之前的项目提示这个,本以为删个什么文件,搜了一阵,没找到答案. 简单粗暴的方法就是再git clone一下,就ok了,这点很不爽.暂时先这么解决了.

  7. FreeRTOS教程4 消息队列

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...

  8. j-link仿真器的作用和价值以及Ubuntu下使用注意事项

    一 J-LINK是什么?   J-Link是SEGGER公司为支持仿真ARM内核芯片推出的JTAG仿真器.配合IAR EWAR,ADS,KEIL,WINARM,RealView等集成开发环境支持所有A ...

  9. esp8266 I2C 实例解析及源码分析

    一  前言 作为一个方案商兼芯片开发者,研究芯片和功能实现除了基本的工作需要,还有一层就是也变成了一种职业习惯.从芯片到方案,发现很多方案公司的人水平都比较堪忧,只会调用api,根本不会看底层的代码实 ...

  10. C++自定义比较函数的bug

    auto cmp = [] (int x, int y) {return true;}; priority_queue<int, vector<int> , cmp> q; 报 ...