首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java Makefile问题

java Makefile问题
EN

Stack Overflow用户
提问于 2012-02-15 15:29:38
回答 3查看 1.5K关注 0票数 0

对于一个家庭作业,我必须为我写的一系列.java文件制作一个makefile (物理的和软件的)。

我写了一个make文件:

代码语言:javascript
复制
JFLAGS = -d -g bin/
JC = javac

.SUFFXES: .java .class

CLASSES = \
    cdn\communications\CommandReader.java \
    cdn\communications\CommandReaderFactory.java \
    cdn\communications\CommandReaderThread.java \
    cdn\communications\DiscoveryCommandReader.java \
    cdn\communications\Link.java \
    cdn\communications\RefreshThread.java \
    cdn\communications\RouterCommandReader.java \
    cdn\node\Discovery.java \
    cdn\node\Node.java \
    cdn\node\Router.java \
    cdn\utility\Utility.java \
    cdn\wireformats\DeRegisterRequest.java \
    cdn\wireformats\DeRegisterResponse.java \
    cdn\wireformats\LinkInfo.java \
    cdn\wireformats\LinkWeightUpdate.java \
    cdn\wireformats\MessageType.java \
    cdn\wireformats\PeerRouterList.java \
    cdn\wireformats\RegisterRequest.java \
    cdn\wireformats\RegisterResponse.java \
    cdn\wireformats\RouterInfo.java \
    cdn\wireformats\WireFormatFactory.java \

all : $(CLASSES)

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

但是当我运行它的时候,我得到了这样的信息:"make:没有为‘`all’做任何事“。我的文件都没写好。

我是不是漏掉了什么?我正在运行包含"cdn“目录层次结构的目录中的文件吗?

任何想法都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-15 17:49:10

修复您的all目标,使其依赖于.class文件,而不是.java文件(这些文件已经存在,因此“没有什么可做的”)。

代码语言:javascript
复制
all : $(CLASSES:.java=.class)

此外,您还必须添加一条将.java文件编译为.class文件的规则:

代码语言:javascript
复制
%.class : %.java
    $(JC) $(JFLAGS) $<

如果使用上面的规则(所谓的pattern rule),则不再需要.SUFFXES:,您可以完全删除它。

票数 1
EN

Stack Overflow用户

发布于 2012-02-15 15:36:09

您还没有指定如何在Makefile中构建java类。本质上类似于下面的内容。

代码语言:javascript
复制
.java.class:
        $(JC) $(JFLAGS) $*.java

请参考this link,它有一个很好的例子。

票数 2
EN

Stack Overflow用户

发布于 2012-08-21 16:05:51

正如上面其他人所概述的,你可以很容易地做这样的事情:

代码语言:javascript
复制
%.class : %.java
  javac flags_go_here

..。但这有几个问题:

  • 如果类之间有任何依赖关系--肯定会有依赖关系--你必须得到正确的顺序。没有任何工具或命令行选项可以像GCC提供的那样为您生成依赖关系。
  • 允许类之间的循环依赖关系。除非将两个类编译在一起,否则无法编译彼此依赖的两个类,例如: class1.java class2.java

${}class1.java

  • javac的启动时间很长。对于小项目,您不会注意到它,但对于任何有足够类的项目,它会快速增加,并且构建时间很快就会下降。

我想出的最佳解决方案如下所示(使用GNU-make样式语法):

代码语言:javascript
复制
all: my.jar

my.jar : c1.java c2.java ... cN.java
  ${JAVAC} ${JAVAC_FLAGS} ${^}
  ${JAR} cf ${JAR_FLAGS} ${@} -C src ${^:%.java=%.class}

# As a bonus, here's how you could do JNI stuff based on individual class files.
# This is necessary because nothing in the build actually depends directly on
# the .class files; if they don't exist and the .jar does, then you need some
# way to get the .class files without rebuilding the jar.

# It's written this way so it's re-usable.
# I'm using 'unzip' instead of 'jar' because it has the -j option so it won't
# dump some/irritating/path/to/work/with/when/all/I/need/is/the/.class/file
define CANNED_JAVAH_TARGET =
$(if $(filter %.java,${^}),,\
  $(error When building ${@}: No jar dependency provided))
unzip -j -d /somewhere/to/put/temp/class/file \
  $(filter %.jar,${^}) ${PKG_PATH}/${@F:%.h=%.class}
${JAVAH} ${JAVAH_FLAGS} <whatever flags are needed to make the header>
endef

${JNI_HEADER_TARGETS} : my.jar
  ${CANNED_JAVAH_TARGET}

javah部分有一个问题:对于JAVAH,如果有人让它依赖于多个jar,它就会崩溃。上面可能有一些小错误或需要解决的事情(根据我的记忆),但总而言之,它对我来说没有太大的麻烦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9289446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档