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

如何在Ninja构建系统的多输出规则中指定特定输出?

在Ninja规则中指定多个输出中的特定项

你遇到的核心问题是Ninja不支持$out1这种变量语法,导致命令中的该变量被替换为空,触发shell语法错误;同时原build语句的格式也存在问题,影响了输出目标的解析。

解决方案

方案一:修正变量语法与build格式

Ninja中引用多个输出里的单个目标,需使用${out[N]}语法(索引N从0开始)。同时修正build语句的格式,正确列出输出目标:

  1. 修正后的规则定义:
rule test3_r
    command = ./$in > ${out[1]}; open ${out[1]}
    description = "tests by making gif and then display"
  1. 修正后的构建规则(添加.PHONY标记伪目标):
.PHONY: test3
build test3 out.gif: test3_r $exefile

方案二:拆分伪目标与实际输出(更清晰)

将test3作为伪目标,单独依赖实际输出out.gif,这样规则仅需处理单个输出,逻辑更简洁:

.PHONY: test3
# 伪目标test3触发out.gif的构建
build test3: phony out.gif

# 实际生成out.gif的规则
build out.gif: test3_r $exefile

rule test3_r
    command = ./$in > $out; open $out
    description = "tests by making gif and then display"

错误原因说明

  • Ninja没有$out1这类变量,多个输出的单个项必须用${out[索引]}语法,索引从0开始(你的场景中test3是第0个输出,out.gif是第1个)。
  • 原build语句的格式错误(每行输出后加$),导致Ninja无法正确解析输出目标列表,进而变量替换失败。
  • 添加.PHONY标记test3,是告知Ninja这是伪目标,无需生成实际文件,避免不必要的文件存在性检查。

内容的提问来源于stack exchange,提问作者netskink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:53:19