news 2026/4/18 8:51:10

Makefile中打印变量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Makefile中打印变量

在Makefile中打印变量有多种方法,以下是常用的几种方式:

1. 使用 $(info) 函数

```makefile
# 示例1:直接打印
VAR = hello world
$(info VAR = $(VAR))

# 示例2:带说明的打印
$(info [DEBUG] VAR = $(VAR))

# 示例3:在规则外部打印(解析阶段打印)
all:
@echo "Building..."
```

2. 使用 $(warning) 函数(带警告格式)

```makefile
VAR = test value
$(warning VAR is set to: $(VAR))

# 输出格式:Makefile:2: VAR is set to: test value
```

3. 使用 echo 在规则中打印

```makefile
VAR = hello
ANOTHER_VAR = world

target:
@echo "VAR = $(VAR)"
@echo "ANOTHER_VAR = $(ANOTHER_VAR)"

# 或者不隐藏命令本身
echo "This command will be shown: $(VAR)"
```

4. 打印所有变量(调试用)

```makefile
# 方法1:打印所有变量(包括内置变量)
print-%: ; @echo $* = $($*)

# 使用方法:make print-CC 或 make print-CFLAGS

# 方法2:打印所有环境变量和Makefile变量
debug:
@echo "=== Makefile Variables ==="
@$(foreach V,$(sort $(.VARIABLES)), \
$(if $(filter-out environment% default automatic, \
$(origin $V)),$(info $V=$($V) ($(value $V)))))

# 方法3:简单的所有变量打印
showvars:
$(foreach v, $(.VARIABLES), $(info $(v) = $($(v))))
```

5. 打印特定变量

```makefile
# 在命令行中打印特定变量
.PHONY: debug
debug:
@echo "CC = $(CC)"
@echo "CFLAGS = $(CFLAGS)"
@echo "LDFLAGS = $(LDFLAGS)"
@echo "SOURCES = $(SOURCES)"
```

6. 条件调试打印

```makefile
# 定义调试标志
DEBUG = 1

# 条件打印函数
ifdef DEBUG
define debug
$(info [DEBUG] $1 = $($1))
endef
else
define debug
endef
endif

# 使用
VAR1 = value1
VAR2 = value2

$(call debug,VAR1)
$(call debug,VAR2)
```

7. 高级调试技巧

```makefile
# 打印变量来源信息
check-%:
@echo '$* = "$($*)"'
@echo ' origin = $(origin $*)'
@echo ' flavor = $(flavor $*)'
@echo ' value = $(value $*)'

# 跟踪变量赋值过程
OLD_SHELL := $(SHELL)
SHELL = $(warning Building $@$(if $<, (from $<)))$(OLD_SHELL)
```

8. 完整示例

```makefile
# Makefile示例
CC = gcc
CFLAGS = -Wall -O2
SOURCES = main.c utils.c
TARGET = app

# 打印变量
$(info === Build Configuration ===)
$(info CC = $(CC))
$(info CFLAGS = $(CFLAGS))
$(info SOURCES = $(SOURCES))
$(info TARGET = $(TARGET))
$(info ============================)

all: $(TARGET)

$(TARGET): $(SOURCES:.c=.o)
@echo "Linking $@..."
$(CC) $(CFLAGS) $^ -o $@

# 用于调试的伪目标
debug:
@echo "Current variables:"
@echo " CC = $(CC)"
@echo " CFLAGS = $(CFLAGS)"
@echo " SOURCES = $(SOURCES)"
@echo " TARGET = $(TARGET)"

.PHONY: all debug
```

使用建议:

1. 调试时:使用 make -p 可以打印所有变量和规则
2. 快速查看:使用 make print-VARNAME
3. 批量查看:创建 debug 目标集中打印
4. 条件调试:使用 ifdef DEBUG 包装调试信息
5. $(info) 在解析阶段执行,echo 在执行阶段执行

选择哪种方法取决于你的具体需求:

· 简单调试:使用 $(info) 或 $(warning)
· 规则内打印:使用 echo
· 详细调试:创建专门的调试目标

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 12:55:43

Figma中文界面终极解决方案:5分钟完成专业设计工具全面汉化

Figma中文界面终极解决方案&#xff1a;5分钟完成专业设计工具全面汉化 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma英文操作界面而困扰&#xff1f;想要快速掌握这款国际…

作者头像 李华
网站建设 2026/4/11 19:20:51

软件I2C多器件总线管理策略:深度剖析

软件I2C多器件总线管理&#xff1a;从原理到实战的系统性设计在嵌入式开发的世界里&#xff0c;你有没有遇到过这样的窘境&#xff1f;MCU上唯一的硬件I2C接口已经被OLED屏占用&#xff0c;而新加入的温湿度传感器和加速度计也非要走I2C——引脚不够、地址冲突、通信时断时续……

作者头像 李华
网站建设 2026/4/17 17:29:06

【系统架构师备考笔记】006 电子政务角色关系

一、核心角色定位政府定义&#xff1a;主导者与服务提供者职责政策制定与平台运营在线服务交付&#xff08;如税务申报 $T\int_{a}^{b} r(t)dt$&#xff09;数据安全管理技术特点政务云平台支撑服务数字化率 $\eta \geq 95%$公民定义&#xff1a;主要受益者与参与者职责使用在线…

作者头像 李华
网站建设 2026/4/17 12:32:57

我们如何把“配环境一天”缩短到“3秒启动”?

我写了十年代码&#xff0c;热情被磨灭的瞬间&#xff0c;往往不是因为一个复杂的算法&#xff0c;而是因为那些无穷无尽的琐事。新同事入职&#xff0c;第一天基本废了&#xff0c;全在配环境。我的 MacBook 风扇狂转&#xff0c;就因为跑了个复杂的后端项目。最怕听到那句“在…

作者头像 李华