WSL下GNU Make用=赋值无法拼接变量,:=正常的原因咨询
WSL下GNU Make延迟赋值(=)失效问题排查
在WSL(Windows Subsystem for Linux)Ubuntu 20.04环境中使用GNU Make时,遇到变量赋值异常:使用=进行延迟赋值时,变量拼接未按预期工作,但切换为:=立即赋值则一切正常。相同的Makefile在Ubuntu虚拟机中可正常运行。
最简复现Makefile
OUTPUT_DIR = 123 BIN = my_program all: echo "$(OUTPUT_DIR)/$(BIN)"
观测到的行为
- WSL环境:执行
make后输出为空变量拼接结果:
/
可见$(OUTPUT_DIR)和$(BIN)均被解析为空值。
- Ubuntu虚拟机环境:执行
make后输出符合预期:
123/my_program
临时可行方案
将变量赋值从=(延迟展开)改为:=(立即展开),WSL和虚拟机环境均能正常工作:
OUTPUT_DIR := 123 BIN := my_program all: echo "$(OUTPUT_DIR)/$(BIN)"
执行make后输出:
123/my_program
环境信息
WSL环境
- WSL版本:WSL 2
- 发行版:Ubuntu 20.04
- GNU Make版本:4.3
- 文件系统:NTFS(Windows文件系统)
虚拟机环境
- 虚拟化平台:VMware
- 发行版:Ubuntu 20.04
- GNU Make版本:4.3
- 文件系统:ext4
已尝试操作
- 检查文件格式:通过
dos2unix Makefile将文件转为Unix换行符(LF),问题仍存在。 - 升级环境:确认WSL为版本2,GNU Make为最新可用的4.3版本。
- 测试立即展开:验证
:=可正常工作,但需明确=失效的原因。
疑问
- 为何
=在WSL中无法正常拼接变量,但在虚拟机中可以? - 该问题是否与WSL底层的NTFS文件系统或GNU Make与WSL的交互逻辑有关?
- 是否存在相关已知问题或针对性解决方法?
内容的提问来源于stack exchange,提问作者范北海
相关产品推荐
相关产品推荐

