当前位置: 首页 > article >正文

Linux 中的 Makefile 伪目标详解

        在 Linux 环境中,Makefile 是构建项目的重要工具,它通过定义规则,指导 make 工具如何编译和链接程序。通常我们会在 Makefile 中定义目标(target),这些目标通常对应文件名。然而,有一种特殊类型的目标叫做伪目标(phony target),它不对应文件,而是用于执行特定操作,如清理构建文件、测试代码等。本文将详细介绍 Makefile 中伪目标的作用、定义和使用方式。

1. 什么是 Makefile 伪目标?

在传统的 Makefile 中,每个目标(target)通常是生成一个文件的规则。例如,当你定义一个目标 myprogram,意味着你希望通过运行相应的规则,生成一个名为 myprogram 的文件。

然而,有些时候我们并不想生成文件,而是执行一些操作,例如清理构建目录或者运行测试。这种情况下,目标并不对应文件,而是用于执行某些任务。为了避免与实际文件名冲突,我们可以使用伪目标

伪目标是不生成任何文件的目标,仅用于执行特定操作。伪目标的典型用途包括:

  • clean:清理编译生成的临时文件。
  • all:编译所有需要的文件。
  • test:运行测试。
  • install:安装程序到指定路径。
示例:
all: myprogram

myprogram: myprogram.o
    gcc -o myprogram myprogram.o

myprogram.o: myprogram.c
    gcc -c myprogram.c

clean:
    rm -f myprogram myprogram.o
在上面的例子中,clean就是一个伪目标。它用于删除构建生成的文件,而不生成任何文件。

2. 定义伪目标的方式:.PHONY

为了明确告诉 make 这个目标不是文件,而是用于执行某个操作,我们需要使用 .PHONY 关键字来定义伪目标。定义 .PHONY 可以让 make 更加高效,因为它不需要检查目标文件是否已经存在,直接执行相应的规则。

示例:
.PHONY: clean

clean:
    rm -f myprogram myprogram.o

通过 .PHONYmake 知道 clean 是一个伪目标,不会去检查是否存在名为 clean 的文件或目录,而是直接执行 rm 命令。

3. 为什么要使用 .PHONY

如果不使用 .PHONY,当目录中有与目标同名的文件时,make 会认为这个目标已经满足条件(即该文件已经存在),从而跳过该目标的执行。

假设我们有如下情况:

clean:
    rm -f *.o

如果当前目录下存在一个名为 clean 的文件,make 会认为这个目标已经“完成”,从而不执行清理操作。这种情况下,使用 .PHONY 就变得尤为重要。

.PHONY: clean

clean:
    rm -f *.o

4. 常见的伪目标示例

4.1 all 伪目标

all 通常被用作默认目标,用于构建项目中的所有主要目标。

.PHONY: all

all: myprogram libfoo.so
4.2 clean 伪目标

clean 通常用于清理编译生成的临时文件。

.PHONY: clean

clean:
    rm -f *.o myprogram
4.3 install 伪目标

install 通常用于将编译生成的文件安装到系统指定的路径。

.PHONY: install

install: myprogram
    cp myprogram /usr/local/bin/
4.4 test 伪目标

test 通常用于运行单元测试或者集成测试。

.PHONY: test

test:
    ./run_tests.sh
4.5 help 伪目标

help 通常用于为 Makefile 提供一个帮助信息,方便用户了解有哪些可用的目标。

.PHONY: help

help:
    @echo "Usage:"
    @echo "  make all     - Build all targets"
    @echo "  make clean   - Remove generated files"
    @echo "  make install - Install the program"
    @echo "  make test    - Run tests"

使用伪目标时牢记:

  • 伪目标不生成文件。
  • 使用 .PHONY 定义伪目标,避免文件名冲突。
  • 伪目标的灵活性使得 Makefile 可以用于执行各种构建和管理任务。

http://www.kler.cn/news/330707.html

相关文章:

  • 【Spring Boot 入门三】Spring Boot与数据库集成 - 构建数据驱动的应用
  • 版本控制-git
  • uniapp中检测应用更新的两种方式-升级中心之uni-upgrade-center-app
  • 产品经理的学习
  • 构建ID3决策树的算法代码 核心部分详细讲解
  • 掌握 C# 异常处理机制
  • STM32堆栈溢出Bug
  • 排序题目:翻转对
  • mac中文件夹怎么显示.git隐藏文件
  • Unraid的cache使用btrfs或zfs?
  • Python 读取与处理出入库 Excel 数据实战案例(HTML 网页展示)
  • 如何使用ssm实现基于web的网站的设计与实现+vue
  • 【有啥问啥】大型语言模型的涌现能力(Emergent Abilities):新一代AI的曙光
  • Android Camera2 与 Camera API技术探究和RAW数据采集
  • 深入理解 Solidity 修饰符(Modifier):功能、应用与最佳实践
  • 【springboot】整合沙箱支付
  • 亚马逊云乱扣费,被不知不觉扣钱真的好气呀
  • [linux] 磁盘清理相关
  • 数学建模--什么是数学建模?数学建模应该怎么准备?
  • 复现 BEVfusion bug集合(4090d)