【问题标题】:Makefile: "multiple target patterns. stop."Makefile:“多个目标模式。停止。”
【发布时间】:2021-07-23 12:28:07
【问题描述】:

我当然又傻了。

谁能告诉我这是为什么?

$(shell compileJava.bat)

没有任何变量、特殊字符、不需要的空格、冒号等的表达式导致错误Makefile:70: *** multiple target patterns. Stop.

我已经在整个互联网上搜索了答案。

我要做什么。

我正在制作一个涉及本地人的 Java 项目。我有这样的结构;

+ root (project)
  -+ build
     -+ natives (for the built native libraries like dlls)
     -+ classes (for the built java classes)
     -+ generated (gradles compileJava task automatically generates jni header files)
  -+ src
    -+ main
      -+ java (all of the java source)
      -+ resources
      -+ c
        -+ Makefile (will be called to compile and link the c(++) code)
  -+ Makefile (the general makefile, error occurs in here at line 70)
  -+ compileJava.bat (calls gradlew compileJava with a jdk argument, but since im using 
      windows and make doesnt support colons, like C:, i had to put it in a batch file) 

根 Makefile 应该遵循这个过程;

[1] call "compileJava.bat" to compile the java code & gen the headers (error occurs here)
[2] call "make -C src/main/c" to run the native build makefile
[3] call "jar cf <name> <contents>" to package all java code (and the natives) into a jar

链接

我的整个根 Makefile:Pastebin

compileJava.bat:Pastebin

【问题讨论】:

    标签: java makefile


    【解决方案1】:

    $(shell ...) 是做什么的?它调用一个 shell 命令,并计算为命令的标准输出

    如果你这样写一个makefile:

    $(shell true)
    

    然后 shell 命令什么也不打印,所以它扩展为什么,然后 make 尝试不计算任何内容,但什么也没有发生。

    如果你这样写一个makefile:

    $(shell echo hi)
    

    然后shell命令打印“hi”,这个函数展开成字符串“hi”,就好像你写了一个makefile:

    hi
    

    当然,这不是一个有效的 makefile。

    所以这个:

    $(shell make -C src/...)
    

    扩展到运行 make 的整个输出,这显然根本不是一个有效的 makefile。

    您可以通过将结果放入变量中来避免这种情况:

    _tmp := $(shell make -C src/...)
    

    但是,我真的认为你需要重新考虑你的整个方法。 Makefile 不是像 shell 脚本那样的过程程序。

    【讨论】:

    • 哦,谢谢,但是我如何从 make 调用批处理文件和另一个 make 实例?还是我应该像你说的那样使用 shell/批处理脚本?
    • 是的,您应该使用 shell 脚本或批处理文件。你已经在编写一个 shell 脚本,你只是在用“makefile 语法”编写它,以最复杂的方式来完成它。 Makefile 适用于您有很多从其他文件构建的文件的情况,如果依赖文件没有更改,您希望避免更新内容。他们还可以并行运行不相交的操作以提高速度。 Makefiles 不适合编写您希望始终运行的一系列步骤,并且始终以相同的顺序一个接一个地运行。为此使用脚本。
    • 啊好的。我将我的整个makefile翻译成批处理(因为我使用Windows),但现在程序在gradle任务完成后停止。你知道如何使用批处理在另一个控制台主机中启动程序吗?
    • 抱歉,我不使用 Windows:我几乎只使用 UNIX 系统。而且,我特别不喜欢 bat 文件:它们太晦涩难懂了。该问题看起来与此处的原始问题完全脱节,因此我建议您创建一个新问题并提出问题,将批处理文件的相关部分剪切并粘贴到问题中(请不要在 StackOverflow 中使用指向远程服务器的链接:目标是其他人可以搜索他们的问题)并正确格式化它们,然后使用适当的标签来引起 Windows 脚本人员的注意。
    • 确实如此。最好将给您带来麻烦的部分提取出来,并将其粘贴到显示问题的最小示例中。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多