Mac下用bash执行Makefile创建文件失败,Eclipse却可正常运行
Makefile在bash执行报错但Eclipse正常的问题解决
问题场景
在Mac系统中,通过bash执行一份平时在Eclipse中可正常运行的Makefile(用于生成prebuild.h文件),Makefile代码如下:
#Project variables for prebuild.h PROJECT_NAME := myproject VARIANT := RELEASE #Create prebuild.h file CREATE_FILE := $(shell echo "/* Generated file. Do not edit. *//" > ../prebuild.h) CREATE_FILE := $(shell echo "#define PROJECT_NAME \""$(PROJECT_NAME)"\"" >> ../prebuild.h) CREATE_FILE := $(shell echo "#define VARIANT \""$(VARIANT)"\"" >> ../prebuild.h) CREATE_FILE := $(shell echo "#define $(VARIANT) \""$(VARIANT)"\"" >> ../prebuild.h)
执行make命令时触发错误:
bash-3.2$ make ../makefile.defs:7: *** unterminated call to function `shell': missing `)'. Stop.
问题原因
核心是不同Make工具的语法容错性差异:
- Eclipse集成的Make工具(可能是适配过的版本或Windows平台的make)对转义语法的容错性更高,能兼容不规范的写法。
- Mac系统默认的GNU Make遵循严格的语法规范,对
$(shell ...)函数内的字符解析更严谨:- 第7行的
*//是错误写法(应为*/),多余的/结合引号导致Make无法正确识别shell函数的闭合)。 - 后续行的
\""$(PROJECT_NAME)"\"转义逻辑错误,多组引号拼接会被Make误判为shell命令的结束标记,截断函数调用。
- 第7行的
修复方案
修正Makefile的语法问题,代码如下:
#Project variables for prebuild.h PROJECT_NAME := myproject VARIANT := RELEASE #Create prebuild.h file CREATE_FILE := $(shell echo "/* Generated file. Do not edit. */" > ../prebuild.h) CREATE_FILE := $(shell echo "#define PROJECT_NAME \"$(PROJECT_NAME)\"" >> ../prebuild.h) CREATE_FILE := $(shell echo "#define VARIANT \"$(VARIANT)\"" >> ../prebuild.h) CREATE_FILE := $(shell echo "#define $(VARIANT) \"$(VARIANT)\"" >> ../prebuild.h)
关键修复点
- 修正注释结束符:将第7行的
*//改为标准的*/,消除多余字符干扰。 - 规范引号转义:把
\""$(VAR)"\"调整为\"$(VAR)\",确保Make能正确解析shell函数内的引号,避免提前截断函数调用。
内容的提问来源于stack exchange,提问作者Richard Klosinski
相关产品推荐
相关产品推荐

