PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : swt unter linux



Heraklit
18-05-2005, 14:34
Hi,

ich möchte mir unter gentoo swt installieren. Das Paket swt habe ich schon mit emerge installiert. Verschiedene Tutorials zu swt beschreiben nur die installation von swt in der eclipse-umgebung oder für windows. Ich möchte aber wie gewohnt die Programme von der Kommandozeile starten.
Wie muss ich also vorgehen, damit ich ein swt-programm in linux ausführen kann?
mfg

peschmae
18-05-2005, 16:44
Zu SWT gehören einige .jar-Dateien und eine dynamische Bibliotheken.

Die Dynamischen Bibliotheken (.so-Dateien) müssen vom Linker gefunden werden - also der Ordner in dem sie drin sind steht in /etc/ld.so.conf (nach Änderungen ldconfig ausführen) oder in der Umgebungsvariable LD_LIBRARY_PATH.

Bei mir sind das die Dateien da:


./plugins/org.eclipse.swt.gtk_3.0.2/os/linux/x86/libswt-gtk-3064.so
./plugins/org.eclipse.swt.gtk_3.0.2/os/linux/x86/libswt-gnome-gtk-3064.so
./plugins/org.eclipse.swt.gtk_3.0.2/os/linux/x86/libswt-pi-gtk-3064.so
./plugins/org.eclipse.swt.gtk_3.0.2/os/linux/x86/libswt-atk-gtk-3064.so
./plugins/org.eclipse.swt.gtk_3.0.2/os/linux/x86/libswt-awt-gtk-3064.so
./plugins/org.eclipse.swt.gtk_3.0.2/os/linux/x86/libswt-mozilla-gtk-3064.so


für SWT auf Gtk-Basis. Am besten suchst du einfach mal nach libswt :)

Zusätzlich gibts noch einige .jar-Dateien. Unter anderem swt.jar (und einfach alle die du im gleichen Ordner findest wie die swt.jar). Die gehören in deine "CLASSPATH"-Umgebungsvariable verstaut:
export CLASSPATH=/opt/eclipse/swt.jar:/opt/eclipse/swt-pi.jar:/opt/eclipse/swt-mozilla.jar:.
oder so ähnlich in deine .bashrc schreiben.

In meinem SWT Tutorial war das aber glaubich beschrieben (ist aber schon so zwei Jahre alt - guck mal auf meiner Homepage)

MfG Peschmä

Heraklit
18-05-2005, 20:22
Hi,
erstmal danke schön für die Antwort. Leider funktioniert es noch nicht ganz:
Ich hab die libswt*.so dateien mit ihren Verzeichnissen (die ich gefunden habe) in /etc/ld.so.conf reingeschrieben und ldconfig ausgeführt und davor in der Konsole ausgeführt. Außerdem habe ich
export CLASSPATH=/opt/eclipse/swt.jar:/opt/eclipse/swt-pi.jar:/opt/eclipse/swt-mozilla.jar:.
in meine .bashrc reingeschrieben. Nun wollte ich folgendes Programm (aus dem Netz) mit javac SWTHelloJava.java kompilieren, was auch ohne Probleme funktionierte:


import org.eclipse.swt.widgets.*;
import org.eclipse.swt.*;

public class SWTHelloWorld
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.NONE);
label.setText("Hello, World!");
shell.pack();
label.pack();
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
label.dispose();
}
}


Leider funktionierte das Ausführen mit java SWTHelloWorld nicht. Hierbei wurde
ausgegeben:


java SWTHelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/internal/gtk/OS
at org.eclipse.swt.internal.Converter.wcsToMbcs(Conve rter.java:63)
at org.eclipse.swt.internal.Converter.wcsToMbcs(Conve rter.java:54)
at org.eclipse.swt.widgets.Display.<clinit>(Display.java:118)
at SWTHelloWorld.main(SWTHelloWorld.java:9)


Wo liegt der Fehler?

mfg

Heraklit
18-05-2005, 21:34
Hi, ich poste noch mal die Dateinträge in aller Ausführlichkeit:
Hierbei liegen die entsprechenden Dateien in /usr/lib/eclipse-3



1 # ld.so.conf autogenerated by env-update; make all changes to
2 # contents of /etc/env.d directory
3 /usr/local/lib
4 /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5-20050130
5 /usr/lib/opengl/ati/lib
6 /usr/lib/mozilla
7 /usr/X11R6/lib
8 /opt/sun-jdk-1.4.2.06/jre/lib
9 /usr/qt/3/lib
10 /usr/kde/3.3/lib
11 /usr/games/lib
12 /usr/lib/eclipse-3/libswt-atk-gtk-3064.so
13 /usr/lib/eclipse-3/libswt-awt-gtk-3064.so
14 /usr/lib/eclipse-3/libswt-gnome-gtk-3064.so
15 /usr/lib/eclipse-3/libswt-gtk-3064.so
16 /usr/lib/eclipse-3/libswt-mozilla-gtk-3064.so
17 /usr/lib/eclipse-3/libswt-pi-gtk-3064.so


-> aufruf von ldconfig
---------------------
bash# ldconfig
ldconfig: /lib/ld-linux.so.1 is not a symbolic link

->classpath:
------------
bash# echo $CLASSPATH
/usr/lib/eclipse-3/swt-mozilla.jar:/usr/lib/eclipse-3/swt.jar:/usr/lib/eclipse-3/swt-pi.jar

->eintrag in .bashrc:export
--------------------------
CLASSPATH=/usr/lib/eclipse-3/swt-mozilla.jar:/usr/lib/eclipse-3/swt.jar:/usr/lib/eclipse-3/swt-pi.jar

peschmae
18-05-2005, 21:51
Verstehe ich nicht - die Klasse OS die er nicht zu finden behauptet ist in dem swt-pi.jar und das ist im Classpath. Das *muss* gehen so.

Das einzige was ich mir jetzt vorstellen könnte ist das es die Datei nicht gibt oder dass die irgendwie kaputt ist und die OS.class-Datei nicht enthält. Beides eher abwegig. :(

MfG Peschmä

Heraklit
18-05-2005, 22:42
Die neueste Fehlermeldung lautet:

$ java SWTHelloWorld
Exception in thread "main" java.lang.NoClassDefFoundError: SWTHello

Woran kanns liegen?

peschmae
18-05-2005, 23:02
Achso, du hast wohl den . nicht im Classpath. Also
CLASSPATH=/usr/lib/eclipse-3/swt-mozilla.jar:/usr/lib/eclipse-3/swt.jar:/usr/lib/eclipse-3/swt-pi.jar:.
damit er auch im aktuellen Verzeichnis wo du gerade bist nach *.class-Dateien sucht.

MfG Peschmä

Heraklit
18-05-2005, 23:47
hmmm, jetzt habe ich wieder das alte Problem...
weißt du irgendeinen ausweg?

mfg

Heraklit
18-05-2005, 23:50
ich habe jetzt übrigens das swt-pi.jar extrahiert und die OS.class ins aktuelle Verzeichnis wo die sourcen liegen verschoben, aber wieder dasselbe Problem

Heraklit
19-05-2005, 00:16
Ich habe jetzt die jar-pakete im verzeichnis des jdks rumgeschoben. und es hat
FUNKTIONIERT:
Die jar-Dateien liegen jetzt zur Info (falls jemanden interessieren sollte) in:
/opt/sun-jdk-1.4.2.06/jre/lib/ext/*.jar

also nochmal vielen Dank für deine Unterstützung ;)

Technaton
19-05-2005, 09:20
Wer solche Probleme hat, wenn er versucht, eine .jar-Datei zu starten: Die entsprechende Datei muß dann Teil des Classpath werden. Daran hing ich einige Zeit. :)

Heraklit
19-05-2005, 09:23
Hi nochmals,
ich hab mir gerade den gcj installiert, um die java sources nativ zu kompilieren.
Im netz hab ich dazu folgenden Befehl gefunden. Angewandt auf SWTHello.java sieht das folgendermaßen aus, was jedoch nicht ganz funktioniert:



bash $ gcj --main=SWTHello -o SWTHello SWTHello.java
/tmp/ccml8DDK.o(.text+0x1e): In function `SWTHello::main(JArray<java::lang::String*>*)':
: undefined reference to `org::eclipse::swt::widgets::Display::class$'
/tmp/ccml8DDK.o(.text+0x2d): In function `SWTHello::main(JArray<java::lang::String*>*)':
: undefined reference to `org::eclipse::swt::widgets::Display::Display[in-charge]()'
/tmp/ccml8DDK.o(.text+0x41): In function `SWTHello::main(JArray<java::lang::String*>*)':
: undefined reference to `org::eclipse::swt::widgets::Shell::class$'
/tmp/ccml8DDK.o(.text+0x57): In function `SWTHello::main(JArray<java::lang::String*>*)':
: undefined reference to `org::eclipse::swt::widgets::Shell::Shell[in-charge](org::eclipse::swt::widgets::Display*)'
/tmp/ccml8DDK.o(.text+0x6b): In function `SWTHello::main(JArray<java::lang::String*>*)':
: undefined reference to `org::eclipse::swt::layout::RowLayout::class$'
/tmp/ccml8DDK.o(.text+0x7a): In function `SWTHello::main(JArray<java::lang::String*>*)':
: undefined reference to `org::eclipse::swt::layout::RowLayout::RowLayout[in-charge]()'
/tmp/ccml8DDK.o(.text+0xd0): In function `SWTHello::main(JArray<java::lang::String*>*)':
: undefined reference to `org::eclipse::swt::widgets::Label::class$'
/tmp/ccml8DDK.o(.text+0xee): In function `SWTHello::main(JArray<java::lang::String*>*)':
: undefined reference to `org::eclipse::swt::widgets::Label::Label[in-charge](org::eclipse::swt::widgets::Composite*, int)'
collect2: ld returned 1 exit status


Was habe ich hier falsch gemacht? Muss man da wieder irgendwelche classpaths setzen?

mfg

Heraklit
19-05-2005, 21:35
Ach ja, für normale Kosolananwendungen funktioniert der gcj mit
gcj prog.java -o prog.o --main=prog einwandfrei. Nur bei SWT-Programmen funktioniert es nicht!? Soweit ich weiß wird SWT vom gcj aber ziemlich gut unterstützt!

mfg