Make wildcard函数截断结果问题排查求助
问题描述
我有一个可在Mac与Emscripten环境正常运行的项目,目前正为其添加Windows支持。安装了捆绑MinGW的JetBrains CLion,尝试构建简单应用时失败,现正在调试Makefile。不知为何wildcard函数似乎截断了文件名,已检查文件名并排查隐藏特殊字符,未发现异常,请问哪里操作有误?
补充代码(该代码在macOS可正常运行)
ifeq ($(findstring _win, $(MAKECMDGOALS)), _win) PLATFORM := win APPNAME := $(subst _win,,$(MAKECMDGOALS)) $(warning APPSRCDIR is $(APPSRCDIR)) $(warning APPNAME is $(APPNAME)) # gather the application files $(warning $(wildcard $(APPSRCDIR)/$(APPNAME)/*.c)) APPOBJS := $(patsubst %.c, %.o, $(notdir $(filter-out $(wildcard $(APPSRCDIR)/$(APPNAME)/*.*.c),$(wildcard $(APPSRCDIR)/$(APPNAME)/*.c)))) $(warning APPOBJS is $(APPOBJS)) APPOBJS += $(patsubst %.c, %.o, $(notdir $(wildcard $(APPSRCDIR)/$(APPNAME)/*.win.c))) $(warning APPOBJS is $(APPOBJS)) APPOBJS := $(addprefix $(BUILDDIR)/$(APPNAME)/$(PLATFORM)/, $(APPOBJS)) $(warning APPOBJS is $(APPOBJS)) endif
排查与解决建议
- 路径分隔符兼容问题:Windows系统使用反斜杠
\作为路径分隔符,当前代码用的是正斜杠/。MinGW Make对路径的处理可能存在兼容问题,建议将路径中的正斜杠转换为反斜杠后再传入wildcard,比如用$(subst /,\,$(APPSRCDIR)/$(APPNAME))生成Windows兼容路径。 - MAKECMDGOALS解析异常:Windows下Make的命令行参数处理逻辑和macOS有差异,
$(subst _win,,$(MAKECMDGOALS))可能没正确提取到APPNAME。先添加$(warning MAKECMDGOALS is $(MAKECMDGOALS))打印完整参数,确认是否存在多余空格或意外字符。 - wildcard通配符匹配逻辑差异:MinGW的wildcard对
*.*.c这类多通配符的匹配规则和macOS的GNU Make不同,可能导致过滤逻辑出错。可以拆分过滤步骤:先获取所有.c文件,再用$(filter-out %.%.c, $(ALL_C_FILES))来排除带多个点的文件,避免嵌套wildcard引发的问题。 - 变量参数的空格问题:代码中
filter-out后面有多个空格,Windows下Make对参数空格的敏感度更高,建议统一用单个空格分隔参数,避免解析错误。 - 检查路径变量的合法性:确认
BUILDDIR、APPSRCDIR等变量对应的Windows路径没有空格或特殊字符,若有空格需要用双引号包裹路径,防止被截断。
内容的提问来源于stack exchange,提问作者mr.b
相关产品推荐
相关产品推荐

