"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

C++ Dll Dependency Problem

wutzdutz 05.03.2009 - 16:37 1439 2
Posts

wutzdutz

owned by 50''
Avatar
Registered: May 2001
Location: Baden bei Wien
Posts: 1632
Hi,
also ich bin C++ Neuling gleich vorweg :). Ich möchte für C++ Klassen ein Java Binding mittels JNI erstellen (für QT bzw. spezielle Widgets). Ich habs jetzt endlich geschafft, den C++ Source des Widgets + den Source der JNI Klasse per g++ in object code zu übersetzen. Weiters ist es mir sogar gelungen, die Sourcen des Widgets in eine Dll, und die Sourcen der JNI-Binding Klassen in eine andere Dll zu packen. Allerdings dürften diese Dll nicht richtig sein, da die abhängigen Dlls falsch eingebunden werden. Das hat sich bemerkbar gemacht, nachdem ich die JNI-Binding Dll in Java laden wollte. Daraufhin hab ich den "Dependency Walker" installiert und die Dll gecheckt.

Hier das Ergebnis:
click to enlarge

Links zu sehen ist meine erstelle JNI-Binding Dll <-> rechts ist eine von Qt erstellte Binding Dll. Hier sieht man schön, dass prinzipiell die selben Dlls verwendet werden (QTGUI4, QTCORE4), allerdings sind sie links falsch und rechts richtig referenziert. Aus irgendeinem Grund referenziert die linke Dll auf "C" Funktionen, und die rechte richtg auf "C++" Funktionen (wenn ich das richtig interpretiere).

Meine Frage ist, was hab ich falsch gemacht? Ich hab mir von beiden Dlls die Make Files angesehen, konnte aber keinen (für mich wesentlichen) Punkt feststellen. Bin jetzt langsam mit meinen minimalen Kenntnissen am Ende und somit "auf der Suche nach Unterstützung" :).
TIA

Edit: VIELEN DANK @that! Die Richtung mit den verschiedenen Compilern war genau richtig. Hab jetzt die richtigen Dlls dazu verlinkt, jetzt läufts :)
Bearbeitet von wutzdutz am 06.03.2009, 10:34

that

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11326
Gute Frage, und eine sehr brauchbare Grundlage (@alle anderen: SO stellt man gute Fragen)

Ich würde mal darauf tippen, dass QTGUI4.DLL mit Microsoft Visual C++ compiliert ist (weil das Microsoft-Tool die Namen richtig anzeigt), und g++ die C++-Methoden für den Linker mit einem anderen Schema benennt (Stichwort: "decorated names", bzw. http://en.wikipedia.org/wiki/Name_mangling).

C++-Funktionen zwischen DLLs funktionieren nur mit dem selben Compiler. Also musst du entweder alle C++-Anteile deiner DLL mit g++ compilieren oder alle mit MSVC.

Viel Glück!

wutzdutz

owned by 50''
Avatar
Registered: May 2001
Location: Baden bei Wien
Posts: 1632
Zitat von that
Gute Frage, und eine sehr brauchbare Grundlage (@alle anderen: SO stellt man gute Fragen)

Ich würde mal darauf tippen, dass QTGUI4.DLL mit Microsoft Visual C++ compiliert ist (weil das Microsoft-Tool die Namen richtig anzeigt), und g++ die C++-Methoden für den Linker mit einem anderen Schema benennt (Stichwort: "decorated names", bzw. http://en.wikipedia.org/wiki/Name_mangling).

C++-Funktionen zwischen DLLs funktionieren nur mit dem selben Compiler. Also musst du entweder alle C++-Anteile deiner DLL mit g++ compilieren oder alle mit MSVC.

Viel Glück!
Danke für die Antwort. Die rechte Dll wurde ebenfalls mit g++ erzeugt, genauso wie die QTGUI4.DLL. Es liegt von QT4 der source vor, daraus werden im Build Prozess mit g++ dann diese Dlls (QTGUI4, QTCORE4,...) erzeugt. Der nächste Schritt im Build ist das Erzeugen der Binding Klassen (C++ und Java) und die Erzeugung der Binding Dll (die rechte). Meine (die linke) habe ich versucht mittels des selben Build Prozesses zu erzeugen, leider erfolglos (wie man sieht).

Soeben ist mir was eingefallen: ich habe meine Dll genauso nach dem Vorbild des Example Builds (ein einfaches Beispiel, das Zeigen soll, wie man Bindings selbst erstellt) -> der erzeugt allerdings ebenfalls fehlerhafte Dlls (laut Dependency Walker - tolles Example). Jetzt werde ich versuchen, die Dll so wie den Original Build zu erzeugen. Mal schauen, ob ich einen Unterschied feststellen kann.

Edit: Noch etwas eingefallen: vielleicht hast du wirklich recht mit dem verschiedenen Compilern. Wenn ich mir das genau ansehe, dann werden die QTGUI4.DLL,.. sowohl mitgeliefert, als auch im Build Prozess erzeugt. Vielleicht linke ich die mittels MSVC compiliert Dll und nicht die mit g++...
Bearbeitet von wutzdutz am 06.03.2009, 08:35
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz