【问题标题】:Error on a makefile生成文件上的错误
【发布时间】:2016-01-28 16:32:36
【问题描述】:

我正在创建一个 makefile 来编译所有代码并运行应用程序。项目写在 JAVA 上。这是执行 make 时抛出的错误:

classes
make: classes: Command not found
make: *** [default] Error 127

这是生成文件

JFLAGS = -g
JC = javac
JVM = java

.SUFFIXES:
    .java .class

.java.class:
    $(JC) $(JFLAGS) $*.java

CLASSES := $(wildcard src/com/github/jotask/groupproject/*.java)
CLASSES += $(wildcard src/com/github/jotask/groupproject/util/*.java)
CLASSES += $(wildcard src/com/github/jotask/groupproject/model/*.java)
CLASSES += $(wildcard src/com/github/jotask/groupproject/gui/*.java)
CLASSES += $(wildcard src/com/github/jotask/groupproject/connection/*.java)
CLASSES += $(wildcard src/com/github/jotask/groupproject/connection/dao/*.java)

MAIN=Application

default:
    classes

classes:
    $(CLASSES:.java=.class)

run:    $(MAIN).class
    $(JVM) $(MAIN)

clean:
    $(RM) *.class

知道为什么会抛出这个错误吗?

【问题讨论】:

    标签: java makefile


    【解决方案1】:

    问题就在这里。

    default:
        classes
    

    这表示目标default 有一个配方,其中包含一个命令。该命令是classes。因此,当 make 尝试构建 default 目标时,它会尝试运行命令 classes 并且您会收到该错误。

    您的意思是 default: classesclasses 成为 default 目标的先决条件。

    也就是说,您根本不需要 default 目标,可以摆脱它。

    makefile 中的默认目标是找到的第一个显式目标。

    同样

    classes:
        $(CLASSES:.java=.class)
    

    不正确,应该是 classes: $(CLASSES:.java=.class) 假设您的意思是 make classes 来构建 .class 文件和

    .SUFFIXES:
        .java .class
    

    同理不正确,想成为.SUFFIXES: .java .class

    那么您可能还想将其他类添加到run 的先决条件列表中,以便在必要时(重新)构建它们。

    所以你可能想要这样的东西。

    JFLAGS = -g
    JC = javac
    JVM = java
    
    %.class: %.java
        $(JC) $(JFLAGS) $<
    
    SRCS := $(wildcard src/com/github/jotask/groupproject/*.java)
    SRCS += $(wildcard src/com/github/jotask/groupproject/util/*.java)
    SRCS += $(wildcard src/com/github/jotask/groupproject/model/*.java)
    SRCS += $(wildcard src/com/github/jotask/groupproject/gui/*.java)
    SRCS += $(wildcard src/com/github/jotask/groupproject/connection/*.java)
    SRCS += $(wildcard src/com/github/jotask/groupproject/connection/dao/*.java)
    
    CLASSES := $(SRCS:.java=.class)
    
    MAIN=Application
    
    .PHONY: run
    run: $(CLASSES)
        $(JVM) $(MAIN)
    
    .PHONY: clean
    clean:
        $(RM) $(CLASSES)
    
    .PHONY: classes
    classes: $(CLASSES)
    

    哪个

    • 使用更现代的Pattern Rules(而不是旧的Suffix Rules
    • 更清楚地命名变量
    • 正确标记Phony Targets
    • 删除不必要的default 目标
    • 并将run 设为新的默认值(并使其自动正确构建所有类)

    【讨论】:

    • 感谢您的回答。那是因为我一直在关注我认为的旧教程。这是我第一次制作make文件。现在我收到以下错误:pastebin.com/HeX7AgHC。我认为他们找不到那个类,我一直在看那个包(文件夹)里面有那个文件
    • 此时您的 makefile 是什么样的,因为它显然不是我写的(不完全是)。你在.PHONY: 之后添加了换行符吗?这些类是否需要按特定顺序编译?是否需要指定 -classpath 才能找到类?
    • 这是生成文件pastebin.com/Ndsm2x4H。我没有添加任何东西。我认为他们不需要指定订单(我不知道这是否属实)。也许问题是我正在使用外部库?这些库与 src 文件夹位于同一级别的 lib 文件夹中,这有关系吗?
    • 是的,你确实改变了它。您在.PHONY: 之后多次添加了换行符。不要那样做;这是错误的。 com.github.jotask.groupproject.guicom.github.jotask.groupproject.gui.Login 不是您的来源吗?那些不需要在使用它们的Application.java 之前编译吗? (也许不是我不做java。)
    • 我认为换行并不重要,抱歉。我刚刚删除了所有更改。是的,gui 包包含 GUI 的所有源代码,而 gui.Login 是一个对话框,所以是的,它们是源代码的一部分。 Application.java 创建一个登录对话框。我尝试逐类编译以查看需要其他类的类,但问题仍然存在。例如,首先我编译 Util.java 并编译,然后如果我编译 Util.java 和 Task.java(使用 Util.java)会抛出 util 不存在的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2011-10-14
    • 2023-03-26
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多