PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gehversuch MAKE mit Java unter Linux


hem
2010-10-25, 21:36:06
Hallo!

Versuche gerade, unter Linux mittels MAKE Javaprogramme zu erstellen. Als Compiler kommt gcj zum Einsatz. Dabei habe ich mich ziemlich nahe am Vorlesungsskript orientiert, bin aber doch nicht ganz erfolgreich.

Insgesamt existieren 3 Java-Klassen in je einem File, eine davon ist die main und versucht, Instanzen der beiden anderen Klasse zu instantiieren.

Das Makefile sieht so aus:


# Makefile
# Kommando-Variablen
JAVAC = gcj
JAVACFLAGS = -Wall -I.
RM = rm -f
# Hilfsvariablen
TARGET = Main
OBJECTS = MyClass1.o MyClass2.o
SOURCES = $(TARGET).java $(OBJECTS:.o=.java)
# Regeln
%.o: %.java
$(JAVAC) $(JAVACFLAGS) -c $< -o $@
# Standardziele
.PHONY: all clean
all: $(TARGET)
clean:
$(RM) $(TARGET) $(TARGET).o $(OBJECTS)
# Ziele zur Programmerstellung
$(TARGET): $(TARGET).o $(OBJECTS)
$(JAVAC) $(JAVACFLAGS) --main=$@ $^ -o $@
# Abhaengigkeiten
Main.o: Main.java MyClass1.java MyClass2.java
MyClass1.o: MyClass1.java
MyClass2.o: MyClass2.java



Wohl während Make kompilieren lässt kommt die Meldung, dass die in Main benutzen MyClass1 und 2 "cannot be resolved to a type". In Eclipse ist das ja die Standardmeldung, wenn der gewünschte Typ nicht verfügbar ist.

In meinem Fall sind makefile als auch die 3 Klassen in einem gemeinsamen Ordner. Der Javacode ist btw. in Ordnung, in Eclipse läuft er.

Die Abhängigkeiten am Ende kann gcj nicht automatisch erzeugen, deswegen stehen die da. Habe mich schon gefragt, ob die Dateien in der Aufzählung in der drittletzten Zeile hinter Main.o: nicht alle auf .o enden müssten, aber so steht es im Skript und ein Versuch brachte keine Besserung.

Danke!

Frucht-Tiger
2010-10-25, 21:57:46
Mit make kann ich dir leider nich weiterhelfen.

Musst du das so zum Laufen bringen? Eigentlich baut niemand Java-Programme mit make, dafür gibts Ant oder Maven, die machen das mit einem Einzeiler.

Gast
2010-10-25, 22:06:46
Jop danke, habe mit Maven schon selbst gearbeitet, aber der Prof will es so haben :/

Die Dateien sind btw. nicht nur im selben Ordner, sondern sind auch nicht in einem eigens erstellen Package.

Shink
2010-10-26, 20:15:38
Musst du das so zum Laufen bringen? Eigentlich baut niemand Java-Programme mit make, dafür gibts Ant oder Maven, die machen das mit einem Einzeiler.
Naja, mit GCJ kann man auch nativen Code rauswürgen - das geht natürlich dann nur mit MAKE da ja z.B. auch .o-Files rauskommen.

TS
2010-10-26, 21:09:17
Naja, mit GCJ kann man auch nativen Code rauswürgen - das geht natürlich dann nur mit MAKE da ja z.B. auch .o-Files rauskommen.

Das ist in meinem Beispiel oben übrigens der Fall :)
Nur eine Lösung für das Problem hab ich nach wie vor nicht

Tiamat
2010-10-27, 07:46:24
Wenn das Script so weit in Ordnung ist, dann muss wohl an den Klassen liegen.
Sind MyClass1 und MyClass2 auch seperate Instanzvariablen von Main ?

Shink
2010-10-27, 09:32:16
Nur eine Lösung für das Problem hab ich nach wie vor nicht
Tja, tut mir leid. Hab mich früher mal (so vor ~7 Jahren:freak:) damit gespielt und dein Problem kommt mir gar nicht so unbekannt vor aber ich kann mich echt nicht mehr erinnern.

Simon
2010-10-27, 17:51:32
Du könntest dir aus cmake deine Makefiles generieren lassen :biggrin:
Hab gerade bei uns das Projekt von manuellen (GNU) Makefiles auf cmake ungestellt und es ist eine Wohltat =)

Der_Donnervogel
2010-10-27, 20:34:46
Das ist in meinem Beispiel oben übrigens der Fall :)
Nur eine Lösung für das Problem hab ich nach wie vor nichtKann es sein, dass beim Compilieren die Klassen nicht gefunden werden? Es ist zwar schon lange her dass ich mal was von Hand mit JavaC (und das auf Windows) compiliert habe, aber so viel ich mich erinnere musste man dort den Classpath setzen (sofern es keine passende Variable gab). Gibt es so einen Parameter vielleicht auch für den Linux Compiler? Das könnte nämlich das Symptom erklären. Falls sich die Klassen zum Linken nicht im Suchpfad finden, kann er auch deren Typen nicht resolven. Eclipse wiederum setzt solche Pfade von selber, weswegen es dort nicht auffällt.

Ich kann mich auch dunkel erinnern, dass man mit den Packages aufpassen musste, wenn man von Hand compiliert. Nur wenn alle Klassen im default-Package waren, konnte man sie einfach alle in ein Verzeichnis schmeißen und compilieren.

Vielleicht helfen die Hinweise ja.

Gast
2010-10-28, 23:17:12
Danke nochmals an alle.

Es war mal wieder einer dieser blöden Fehler.. Umlaut im Pfad des Verzeichnisses, da ist Linux ja allergisch dagegen. Ansich existiert der Pfad aber und ist physikalisch auch vorhanden, gemeckert wurde beim erstellen trotz Umlaut nicht.