news 2026/10/20 8:00:55

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/10/19 9:29:37

多FDCAN接口同步配置实战:双通道并行通信实现

多FDCAN接口实战&#xff1a;双通道并行通信如何突破带宽瓶颈你有没有遇到过这样的情况&#xff1f;在开发一个高实时性的车载控制模块时&#xff0c;CAN总线突然“卡顿”——数据延迟飙升、报文丢失频发。排查一圈后发现&#xff0c;并不是硬件故障&#xff0c;而是单条CAN通道…

作者头像 李华
网站建设 2026/10/19 13:43:50

Day 34:【99天精通Python】单元测试 (Unittest) - 给代码上个保险

Day 34&#xff1a;【99天精通Python】单元测试 (Unittest) - 给代码上个保险 前言 欢迎来到第34天&#xff01; 在之前的开发中&#xff0c;我们通常是怎么验证代码对不对的&#xff1f; —— 写完代码&#xff0c;手动运行一下&#xff0c;输入几个参数&#xff0c;看看打印结…

作者头像 李华
网站建设 2026/10/18 8:46:07

基于Simulink的混合PO与INC切换MPPT策略仿真

目录 手把手教你学Simulink 一、引言&#xff1a;为什么需要“混合P&O与INC”&#xff1f; 二、系统整体架构 控制流程&#xff1a; 三、核心算法详解 1. P&O 算法&#xff08;扰动观察法&#xff09; 2. INC 算法&#xff08;电导增量法&#xff09; 3. 光照突…

作者头像 李华
网站建设 2026/10/8 16:31:39

工业场景中弧形导轨的安装要点

弧形导轨作为工业自动化中实现弧线运动的核心部件&#xff0c;常用于机械臂关节、旋转工作台、自动化生产线转弯部位&#xff0c;医疗CT机的旋转扫描部件也依赖高精度弧形导轨实现平滑运动。其安装质量直接影响设备运行精度与寿命&#xff0c;从材料准备到定位调试&#xff0c;…

作者头像 李华