You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Red Hat Linux下make报错'target pattern contains no %',HP Unix可正常运行

问题:Red Hat Linux下make报错"target pattern contains no '%'",HP Unix可正常运行

错误场景

在Red Hat Linux环境执行make -f Makefile release时触发错误,相同操作在HP Unix环境可正常完成。

错误输出

make -f Makefile release
/users/src/Excalibur/hertz/make/ProjectRules:115: *** target pattern contains no '%'.  Stop.

相关代码片段

  1. ProjectRules文件第115行规则
$(COB_OBJS): $(COBSRCDIR)/$$(@:.o=.cbl)
        $(COB) -xcv $(COBSRCDIR)/$(@:.o=.cbl)
  1. ProjectMacros文件末尾的变量定义
# we need this in order to have the generic lib and exec rules
LIB     = .foob
EXEC    = .foob
DBSERV  = .foob
COB_EXEC = .foob
COB_OBJS = .foob
COB_LIB_OBJS = .foob
COB_LIB = .foob
SHLIB   = .foob
SHLIB_OBJS = .foob
COB_SERV = .foob
DCESERV = .foob
  1. 手动验证变量结果(bash环境)
$ echo $COB_OBJS
-bash: COB_OBJS: unbound variable
$ echo $COBSRCDIR
/users/src/Excalibur/hertz/src/cob
$ echo $COB
cob -g -a -v -C SOURCEFORMAT=FREE -C noalter -C noanim -C noseg -C notrunc -C nonestcall -C nocheckdiv -C noodoslide -C bound

问题分析与解决

核心原因

COB_OBJS变量在make环境中未被正确赋值:

  • 当前COB_OBJS被设置为.foob这个占位符,展开后规则变为.foob: $(COBSRCDIR)/$$(@:.o=.cbl),既不是合法的模式规则(缺少%),也不是普通规则(依赖中的$@对固定目标.foob无意义),导致make报错。
  • HP Unix环境正常的原因大概率是该环境下COB_OBJS被正确替换为实际的目标文件列表(如file1.o file2.o),或者HP的make工具对此类无效规则容错性更高。

解决步骤

  1. 修正COB_OBJS赋值:.foob是占位符,需在makefile的其他位置或执行make时,将其替换为实际的COBOL目标文件列表(例如cob_module1.o cob_module2.o)。检查ProjectMacros或其他被引用的makefile,确认是否有覆盖COB_OBJS的逻辑。
  2. 验证make环境变量:在ProjectRules中添加$(info COB_OBJS in make: $(COB_OBJS)),执行make时查看实际的变量值(bash环境的echo $COB_OBJS无法反映make内部的变量状态)。
  3. 确认规则有效性:当COB_OBJS为有效目标列表时,当前的静态模式规则写法是合法的,可正常匹配每个.o文件对应的.cbl源文件进行编译。

内容的提问来源于stack exchange,提问作者Praveen K C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:23:22