[开发工具] Makefile工具

[复制链接]
763|5
 楼主| 小小蚂蚁举千斤 发表于 2024-1-18 14:23 | 显示全部楼层 |阅读模式
Makefile是一种编译控制文件,广泛用于项目的自动化构建。它定义了一系列的规则来指导构建的过程。通过Makefile,开发者可以轻松管理大型项目的编译链接、清理等任务。
Makefile的基本结构
一个最简单的Makefile包含规则,规则由目标(target)、依赖(dependencies)和命令(commands)三部分组成:

  1. target: dependencies
  2.     commands

命令前的Tab键是必须的。下面是一个简单的示例:

  1. hello: hello.c
  2.     gcc -o hello hello.c




变量的使用
在Makefile中声明变量可以使得我们的代码更加简洁。

  1. CC=gcc
  2. CFLAGS=-std=c99
  3. LDFLAGS=
  4. OBJ=main.o utils.o

  5. app: $(OBJ)
  6.     $(CC) -o app $(OBJ) $(LDFLAGS)

  7. main.o: main.c
  8.     $(CC) $(CFLAGS) -c main.c

  9. utils.o: utils.c utils.h
  10.     $(CC) $(CFLAGS) -c utils.c
 楼主| 小小蚂蚁举千斤 发表于 2024-1-18 16:22 | 显示全部楼层

通用规则和模式匹配
模式规则可以减少我们重复相同命令的工作量。

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

$< 是自动变量之一,代表依赖列表中的第一项。

自动化变量
Makefile提供了一系列自动化变量,它们在规则的命令中非常有用:

$@ 表示规则中的目标文件名;
$^ 表示所有的依赖文件列表;
$< 表示第一个依赖文件;
$? 表示所有比目标新的依赖文件列表。

函数的使用
Makefile中内置了许多函数,用以执行字符串操作、文件操作等。

例如,获取源文件列表:

  1. SRC=$(wildcard *.c)
  2. OBJ=$(patsubst %.c,%.o,$(SRC))

控制Make的行为
make -B 强制重新编译所有目标;
make -n 显示将要执行的命令而不实际执行;
make -f <file> 指定使用其他名称的Makefile文件;
make -j 允许并行执行(多核编译)。
 楼主| 小小蚂蚁举千斤 发表于 2024-1-18 16:23 | 显示全部楼层

高级用法 - 条件判断
Makefile也支持条件判断,这在不同环境需要执行不同命令时非常有用。

  1. ifeq ($(OS),Windows_NT)
  2.     RM=del /Q
  3. else
  4.     RM=rm -f
  5. endif

  6. clean:
  7.     $(RM) *.o

使用变量和文件包含来组织Makefile
对于大型项目,组织多个Makefile是一种好方法。

  1. # 在子Makefile中
  2. include config.mk


自定义函数
通过定义可以重用的函数,你可以使你的Makefile变得更加强大和灵活。

  1. define run-cc
  2. $(CC) $(CFLAGS) -o $@ $^
  3. endef

  4. app: $(OBJ)
  5.     $(call run-cc)
 楼主| 小小蚂蚁举千斤 发表于 2024-1-18 16:24 | 显示全部楼层

处理多目标
定义一个规则来批量处理多个文件。

  1. FILES := file1 file2 file3

  2. all: $(FILES)

  3. $(FILES):
  4.     touch $@

伪目标的使用
伪目标不代表实际的文件,它只是一个动作的名称。

  1. .PHONY: clean

  2. clean:
  3.     rm -f *.o app


调试Makefile
你可以使用make --debug或添加注释来帮助调试Makefile。

  1. app: main.o utils.o
  2.     # 这是一个链接的命令
  3.     $(CC) -o app main.o utils.o
 楼主| 小小蚂蚁举千斤 发表于 2024-1-18 16:24 | 显示全部楼层
结语
Makefile是构建自动化的强大工具,既可以简化小型项目的构建流程,也能够灵活管理大型应用程序的复杂构建系统。通过本文的详细论述和丰富示例,您应该能够基本掌握Makefile的各项技能,并在实际项目中加以应用。

希望以上内容对你深入理解和使用Makefile有所帮助。记住,“实践出真知”——编写你自己的Makefile并尝试使用这些特性是最好的学习方式。


中国龙芯CDX 发表于 2024-1-24 08:21 | 显示全部楼层
Makefile是一种编译控制文件,广泛用于项目的自动化构建。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

228

主题

2630

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部