【问题标题】:Target dependency: Makefile no rule to make target error目标依赖:Makefile no rule to make target 错误
【发布时间】:2020-05-04 19:31:28
【问题描述】:

这是我正在运行的make文件,

.PHONY: build
build: pre_build_script $(OUTPUTDIR)/%.cpp

$(OUTPUTDIR)/%.cpp: $(INTXTDIR)/%.txt
    python.exe $(SOMEDIR)/somepythonscript.py $(INTXTDIR) $(OUTPUTDIR) 

.PHONY: pre_build_script
pre_build_script:
    pythonscript.exe $(PREBUILDDIR)

这是我得到的输出:

$ make build
  pythonscript.exe $(SAMPLEDIR)
  make: *** No rule to make target '../obj/CPP/%.cpp', needed by 'build'.  Stop.

尽管声明了目标依赖项,但我得到了这个错误,看起来我缺少一些 sytanx。有什么建议?

【问题讨论】:

    标签: makefile dependencies target


    【解决方案1】:

    这意味着make 找不到名为$(OUTPUTDIR)/%.cpp 的文件,这是第一条规则的先决条件。

    您不能在这样的规则中的任何地方使用% 作为通配符:

     build: pre_build_script $(OUTPUTDIR)/%.cpp
    

    它必须是pattern rulestatic pattern rule 的一部分。

    您可以使用$(wildcard $(OUTPUTDIR)/*.cpp) 获取完整的文件列表,但这是一种反模式(双关语)。您应该确切地知道在哪些规则中使用了哪些文件,或者(更好地了解它并)创建一个通用模式规则。

    第二个模式规则(使用somepythonscript.py)应该适用于单个源-目标文件对,$(INTXTDIR)/%.txt -> $(OUTPUTDIR)/%.cpp。该命令似乎处理了目录中的所有文件,这不是增量的:即使只更新了一个文件,它也会重做所有工作。

    【讨论】:

    • 请注意,您不能使用$(wildcard $(OUTPUTDIR)/%.cpp,因为在解析makefile 时这些将不存在......这些是生成的文件。你需要使用$(patsubst $(INTXTDIR)/%.txt,$(OUTPUTDIR)/%.cpp,$(wildcard $(INTXTDIR)/*.txt))
    • 好的,非常感谢。如果我们将源文件的词干列表提取到另一个变量中,表达式会看起来更简单。但是应该重写 makefile 以使用模式规则一一处理。
    • 谢谢@VictorSergienko 和@MadScientist。不过,一个后续问题是,对于具有诸如 say-> target: dependency1 dependency2 dependency3 之类的依赖项的目标,make target 默认情况下是否并行运行所有这些依赖项,或者您需要使用 -j 显式指定它?
    • maketarget 之前构建所有target 的依赖项。默认情况下,它使用一个 CPU 内核,除非您指定 -j - 然后它可以并行运行不相互依赖的目标(如依赖 1 依赖 2)。
    • 正确。 Make 总是一次只运行一个命令,等到它退出再启动下一个命令,除非你特别要求它使用 -j 选项同时运行多个命令。
    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多