编辑:基本上,我正在尝试做与输入" javac sim.java"相同的事情。然后" java sim(命令)"。有没有办法用makefile替换它?
所以我在网上看了很多例子并尝试将它们修改为我需要的,但没有任何效果。我需要一个makefile,这样我的老师就可以通过键入" make"来创建我的项目。进入终端(由于某种原因,这是项目的要求)。我的最终目标是能够键入" sim"然后是我的代码定义的必需命令。代码在eclipse中运行,但我无法在终端中使用这些命令运行它。它将生成文件,但它表示" sim:command not found"当我尝试输入" sim ....(参数)"进入终端。 我确定这是一个愚蠢的问题,但我们在学校没有学到这一点,而且我没有使用Makefile的经验。
下面是我的makefile。
JFLAGS = -g
JC = javac
OPT = -O3
#OPT = -g
WARN = -Wall
sim: sim.class
sim.class: sim.java
$(JC) $(JFLAGS) sim.java
clean:
$(RM) sim.class
clobber:
$(RM) sim.class
答案 0 :(得分:5)
只要有多个课程,使用make with java就可以用锤子驱动螺丝。
使用java代码将使用包。因此,您将拥有一个复杂的目录树,它反映了您的包结构,其中包含.java源文件。写作制定了“看到'所有这些文件都很痛苦。
您应该同时在所有源文件上调用javac以获得正确的结果。因此,通常的make模式是运行一个命令将一个源文件转换为一个编译文件'效果不好。
然而,好像你现在的主要问题是你希望java生成一个可执行文件;名为' sim'的文件。不,不会以任何简单的方式发生。 java编译器生成.class文件;它们的整个树,用于源文件。您可以直接从它们运行,也可以将它们打包到JAR文件中。
为了获得一个看似简单的命令行可执行文件的东西,你需要使用一个更复杂的工具,用前面的脚本包装所有这些。
目前,你只需要这样做:
java -cp . NAME_OF_THE_CLASS_IN_sim.java
在makefile完成后运行。
答案 1 :(得分:3)
对于没有很多文件或依赖项的简单项目,我只使用脚本。
构建:
javac -cp .;* *.java
运行:
java -cp .;* SomeMainClass
将.
替换为源所需的路径。 *将使用默认路径上的任何jar或使用不同的路径,如lib/*
。
答案 2 :(得分:1)
make通过执行其依赖关系执行配方,然后执行配方本身。因此,如果您将运行已编译代码的命令添加到顶部配方,则键入“make”也将在编译后运行代码。我不敢相信有多少人不知道这个!
类似的东西:
sim: sim.class
java sim
将完成导师所需的工作。
答案 3 :(得分:1)
如果您具有如下所示的简单目录布局,
root/
src/
ExampleClass.java
AnotherClass.java
out/
makefile
您可以这样创建makefile
:
##
# source directory
##
SRC_DIR := src
##
# output directory
##
OUT_DIR := out
##
# sources
##
SRCS := $(wildcard $(SRC_DIR)/*.java)
##
# classes
##
CLS := $(SRCS:$(SRC_DIR)/%.java=$(OUT_DIR)/%.class)
##
# compiler and compiler flags
##
JC := javac
JCFLAGS := -d $(OUT_DIR)/ -cp $(SRC_DIR)/
##
# suffixes
##
.SUFFIXES: .java
##
# targets that do not produce output files
##
.PHONY: all clean
##
# default target(s)
##
all: $(CLS)
$(CLS): $(OUT_DIR)/%.class: $(SRC_DIR)/%.java
$(JC) $(JCFLAGS) $<
##
# clean up any output files
##
clean:
rm $(OUT_DIR)/*.class