4

作成したMakefileを使用してJavaプロジェクトをコンパイルしようとすると、このエラーが発生します。

エラー:

作る:src/edu/osu/lispinterpreter/output/*.class', needed byターゲットクラスを作成するルールはありません。止まる。*

Makefileの内容:

JFLAGS = -g
JC = javac
.SUFFIXES: .java .class
.java.class:
    $(JC) $(JFLAGS) $*.java

CLASSES = \
        src/edu/osu/lispinterpreter/tokenizer/*.java \
        src/edu/osu/lispinterpreter/core/*.java \
        src/edu/osu/lispinterpreter/output/*.java \
        src/edu/osu/lispinterpreter/exceptions/*.java \
        src/edu/osu/lispinterpreter/input/InputParser.java \
        src/edu/osu/lispinterpreter/input/ReadInputString.java 

default: classes

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

clean:
    $(RM) *.class

誰かがMakefileを手に入れてくれませんか?

私はEclipseを使用しています。

4

3 に答える 3

2

http://www.gnu.org/software/make/manual/html_node/Wildcard-Pitfall.html#Wildcard-Pitfallから

ワイルドカードが一致するファイルがない場合は、そのまま残されます

src / edu / osu / lispinterpreter / outputが空のようであるため、src / edu / osu / lispinterpreter / output / *。javaはどのファイルとも一致せず、そのまま残されますが、これは意図したものではありません。ワイルドカード関数を使用すると、これを回避できます。

解決策は、置き換えることです

src/edu/osu/lispinterpreter/output/*.java

$(wildcard src/edu/osu/lispinterpreter/output/*.java)

他のすべての行についても同様です。

于 2013-03-09T02:56:52.817 に答える
1

*問題は、CLASSES変数での使用にあると思います。あなたがその変数を書いた方法で、それはそれらの中に文字を含む「ファイル名」のリストで埋められてい*ます...それは残りの処理を通して伝播します。

クラスを個別にリストするか、Makeにリストを「グロブ」するように指示する必要があります。GNU Makeを使用している場合は、ワイルドカード関数でうまくいくはずです。

ただし、他のバージョンのMakeでは機能しないため、Makefileの移植性に問題があることに注意してください。(これにより、Antの方が優れているという私のコメントに戻ります。)


そして、それを乗り越えたら、Javaクラスを一度に1つずつコンパイルする場合、次のような問題が発生します。

  • ビルドは非常に遅くなります...'cos各javacコマンドでJVMの起動が発生します(ホットスポットまたはOpenJDKツールチェーンを使用していると仮定)。
  • あなたは正しい順序でクラスを構築する必要があります...ソースコードに固有の依存関係に従って、
  • これらの依存関係をMakefile(!!!)に追加する必要があります。
  • 依存関係のサイクルがある場合は、問題が発生します。

十分な忍耐力があれば、これに対処するMakefileを作成できますが、それは本当にトリッキーであり、結果のMakefileは壊れやすくなります。現実的な代替案は次のとおりです。

  • 依存関係に関係なく、1つのコマンドですべての/.javaファイルをビルドするだけですjavac
  • ソースコードまたはバイトコードファイルを分析し、Makefileに依存関係を生成するために何かを使用する「makedepend」ルールを追加します。

または、Antを使用します。

参照:

于 2013-03-09T02:57:39.803 に答える
1

すべてのソースファイルを個別に一覧表示するかwildcard、Makefileのディレクティブを使用して、代わりにファイルを自動的に照合します。

また、あなたのコメントから、Javaファイルのパッケージ名はであるように見えますedu.osu.lispinterpreter.*

したがってMakefile、をsrcディレクトリに移動し、Makefileでこれらの変更を行うことをお勧めします。

CLASSES := $(wildcard edu/osu/lispinterpreter/tokenizer/*.java)
CLASSES += $(wildcard edu/osu/lispinterpreter/core/*.java)
CLASSES += $(wildcard edu/osu/lispinterpreter/output/*.java)
CLASSES += $(wildcard edu/osu/lispinterpreter/exceptions/*.java)
CLASSES += edu/osu/lispinterpreter/input/InputParser.java
CLASSES += edu/osu/lispinterpreter/input/ReadInputString.java

Javaコンパイラは、パッケージ名がディレクトリ構造に対応している限り、に明示的な依存関係を記述せずに、他のパッケージからクラスの定義を取得できる必要がありますMakefile

于 2013-03-09T03:04:42.617 に答える