make all in Makefile

看这个 Makefile 的语法,make all 目标有语法错误。我来分析一下:

问题分析

makefile 复制代码
# 这里有语法问题
all: $(TARGETS)

实际上,这一行应该是:

makefile 复制代码
all: clean c-example

但原作者可能是想通过变量来定义,但格式不正确。

正确写法应该是

makefile 复制代码
# 定义变量
CC = clang
CFLAGS = -g -Wall
TARGETS = clean c-example

# 默认目标(当只输入'make'时执行)
default: c-example

# all 目标依赖于 TARGETS 变量中的目标
all: $(TARGETS)

# 编译目标
c-example: c-example.c
    $(CC) $(CFLAGS) $< -o $@  # 注意:应该是 $@ 不是 $0

# 清理目标
clean:
    $(RM) -rf c-example *~ *dSYM

# 声明伪目标
.PHONY: all clean default

make all 会做什么?

基于这个 Makefile(修正后):

  1. 依赖关系allcleanc-example

  2. 执行顺序

    bash 复制代码
    make all
        ↓
    执行 clean 目标
        ↓
    $(RM) -rf c-example *~ *dSYM
        ↓
    执行 c-example 目标  
        ↓
    $(CC) -g -Wall c-example.c -o c-example
  3. 最终效果

    • 先删除所有生成的文件
    • 然后重新编译 c-example

变量和特殊符号解释

makefile 复制代码
# 自动变量:
$< = 第一个依赖文件的名字(这里是 c-example.c)
$@ = 目标文件的名字(这里是 c-example)
$^ = 所有依赖文件的名字

# 原文的错误:
$0  # 错误!应该是 $@

完整的正确版本

makefile 复制代码
CC = clang
CFLAGS = -g -Wall
TARGETS = clean c-example

default: c-example

all: $(TARGETS)

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

clean:
    $(RM) -rf c-example *~ *dSYM

.PHONY: all clean default

运行测试

bash 复制代码
# 测试 make all
$ make all
rm -rf c-example *~ *dSYM        # 执行 clean
clang -g -Wall c-example.c -o c-example  # 执行 c-example

# 测试默认目标
$ make  # 等同于 make c-example
clang -g -Wall c-example.c -o c-example

# 测试 clean
$ make clean
rm -rf c-example *~ *dSYM

清理命令解释

makefile 复制代码
$(RM) -rf c-example *~ *dSYM
  • $(RM):平台无关的删除命令(通常是 rm
  • -rf:递归强制删除
  • c-example:可执行文件
  • *~:Emacs/Vim 等编辑器创建的备份文件
  • *dSYM:Mac 上的调试符号目录

总结

在这个 Makefile 中,make all 会:

  1. 先执行 clean:删除所有生成的文件
  2. 再执行 c-example:重新编译程序

这是一种强制完全重新构建的模式,确保没有残留的旧文件影响新编译。

相关推荐
我叫洋洋9 小时前
C ++ [ hello world ]
c语言·c++·算法
天空'之城10 小时前
C 语言工业级通用组件手写 09:CRC32 数据校验
c语言·嵌入式开发·数据校验·crc32·工业级组件
Scott9999HH13 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
天空'之城15 小时前
C 语言工业级通用组件手写 06:固定块内存池
c语言·嵌入式开发·内存池·底层优化
十月的皮皮16 小时前
stm20260720-从新手 C 到量产 STM32 工程:程序设计推导指南
c语言·开发语言·stm32·stm32cubemx·hal库
Echo缘16 小时前
嵌入式系统C语言资源分类与内存分布分析
c语言·开发语言
chexus21 小时前
20. 深入 Nginx 信号处理
linux·c语言·网络·nginx
代码雕刻家21 小时前
编程语法细节
java·c语言·开发语言
草莓熊Lotso1 天前
【Linux网络】深入理解Linux IO多路复用:从本质到select服务器实战
linux·运维·服务器·c语言·网络·数据库·c++
Discipline~Hai2 天前
ARM01-ARM体系架构
linux·c语言·arm开发·架构