Seite 1 von 1

DLL export name probleme

Verfasst: 4. April 2006 13:54
von mosek
Hallo,

beim Erstellen einer DLL mittels QT entstehen bei mir ein paar Probleme. Die Exportnamen der Functionen sind leider nicht mit denen der Header Definitionen identisch (z.B. wird aus "test" >> "_Z5testPcS_").
Im normalen Fall mit der QT internen Verlinkung interessiert das wohl kaum, jedoch will ich von extern (z.B FoxPro) auf die DLL zugreifen. Dann ist dieser Umstand etwas nervig, da ich jedesmal die aktuellen tatsächlichen Namen herausfinden muss.

Gibs da irgendwie ein System, oder gar einen Trick ? Die Win32 DLLs haben diesen Problem ja auch nicht.

Ach ja, hier ist die Header-Export Definition:

Code: Alles auswählen

#ifdef BUILDING
# ifdef WIN32		// win32 only
#  define REF_DLL __stdcall __declspec(dllexport)
# else
#  define REF_DLL	// empty macro
# endif
#else
# ifdef WIN32
#  define REF_DLL __declspec(dllimport)
# else
#  define REF_DLL	// empty macro
# endif
#endif
Die Funktionen sind mit

Code: Alles auswählen

extern "C" REF_DLL
compiliert.

Vielleicht gibts eine Möglichkeit mit der DEF Datei ? Bin da leider gescheitert.

Gruss nach draussen ...

Re: DLL export name probleme

Verfasst: 4. April 2006 14:00
von Shadow
mosek hat geschrieben:Hallo,

Gibs da irgendwie ein System, oder gar einen Trick ? Die Win32 DLLs haben diesen Problem ja auch nicht.

[..CUT..]

Ach ja, hier ist die Header-Export Definition:

Die Funktionen sind mit

Code: Alles auswählen

extern "C" REF_DLL
compiliert.

Vielleicht gibts eine Möglichkeit mit der DEF Datei ? Bin da leider gescheitert.

Gruss nach draussen ...
Dann erstelle halt eine Version als echtes Qt-Plugin (Q_EXPORT_PLUGIN, u.s.w.) und eine Version, wie du schon oben beschrieben hast als reine WIN32-DLL. Genaugenommen generiert ja der MOC-Compiler bei den QT-Plugins die Einstiegspunkte für die DLL, daher treten die Probleme bei FoxPro auf.

Re: DLL export name probleme

Verfasst: 4. April 2006 16:17
von Christian81
Shadow hat geschrieben: Dann erstelle halt eine Version als echtes Qt-Plugin (Q_EXPORT_PLUGIN, u.s.w.) und eine Version, wie du schon oben beschrieben hast als reine WIN32-DLL. Genaugenommen generiert ja der MOC-Compiler bei den QT-Plugins die Einstiegspunkte für die DLL, daher treten die Probleme bei FoxPro auf.
Was hat sein Problem mit Plugins zu tun?

Wie bindest du deine Funktionen in FoxPro ein? Wenn ich richtig liege, funktioniert das nur mit reinen C-funktionen und nicht mit C++-Klassen...

Re: DLL export name probleme

Verfasst: 4. April 2006 16:35
von Shadow
Christian81 hat geschrieben:
Shadow hat geschrieben: Dann erstelle halt eine Version als echtes Qt-Plugin (Q_EXPORT_PLUGIN, u.s.w.) und eine Version, wie du schon oben beschrieben hast als reine WIN32-DLL. Genaugenommen generiert ja der MOC-Compiler bei den QT-Plugins die Einstiegspunkte für die DLL, daher treten die Probleme bei FoxPro auf.
Was hat sein Problem mit Plugins zu tun?

Wie bindest du deine Funktionen in FoxPro ein? Wenn ich richtig liege, funktioniert das nur mit reinen C-funktionen und nicht mit C++-Klassen...
Gar nichts, deshalb sollte man ja QT diesbezüglich außen vor lassen.

Verfasst: 4. April 2006 16:53
von mosek
Danke für den Tip.

Das mit den Plugins hilft mir vermutlich nichts. Das ich QT nehme und zugängliche Funktionen erstellen will, hat seinen Grund. Im übrigen habe ich festgestellt, das auch Standard MinGW Projekte (zumindest unter Exclipse erstellte) eine ähnliche Problematik aufweisen.

Scheinbar handelt es ich um irgendeine Linker-Problematik (Option etc.), da ich auch schon mit Qt erstellte Bibliotheken ohne diese Makel gesehen habe.

Verfasst: 4. April 2006 16:57
von Shadow
mosek hat geschrieben:Danke für den Tip.

Das mit den Plugins hilft mir vermutlich nichts. Das ich QT nehme und zugängliche Funktionen erstellen will, hat seinen Grund. Im übrigen habe ich festgestellt, das auch Standard MinGW Projekte (zumindest unter Exclipse erstellte) eine ähnliche Problematik aufweisen.

Scheinbar handelt es ich um irgendeine Linker-Problematik (Option etc.), da ich auch schon mit Qt erstellte Bibliotheken ohne diese Makel gesehen habe.
Wenn Du externe DLL's in QT-Programmen verwenden willst, kommst du an QT-Plugins nicht vorbei. Deshalb schrieb' ich bereits, dass du vielleicht eine DLL ohne jeglichem QT compilieren solltest (für FoxPro) und eine Version mit QT für die andere Applikation. Die PlugIn-Funktionalitäten wurden nicht umsonst von Trolltech seit der 4er Version so aufgebohrt.

Verfasst: 4. April 2006 17:53
von Christian81
mosek hat geschrieben:Scheinbar handelt es ich um irgendeine Linker-Problematik (Option etc.), da ich auch schon mit Qt erstellte Bibliotheken ohne diese Makel gesehen habe.
Das ist kein Makel und Qt-lib ohne das gibts nicht.
Es nennt sich 'name mangeling' und ist auch ein Grund dafür, warum man C++-Dlls immer für einen speziellen Compiler braucht - man kann aufgrund des name mangleings keine MingW-C++DLL mit MSVC benuttz und umgekehrt.
Was mich wundert ist, dass deine Definition mit extern "C" REF_DLL usw. richtig ist. Das einzigste was mir noch einfällt ist, die sourcen mal als C-Sourcen zu übersetzen bzw. extern "C" so zu maskieren:

Code: Alles auswählen

#ifdef __cplusplus
extern "C" {
#endif

REF_DLL void myCFunction(int);

#ifdef __cplusplus
}
#endif

Verfasst: 5. April 2006 10:11
von mosek
Christian81 hat geschrieben:...Was mich wundert ist, dass deine Definition mit extern "C" REF_DLL usw. richtig ist. Das einzigste was mir noch einfällt ist, die sourcen mal als C-Sourcen zu übersetzen bzw. extern "C" so zu maskieren:
Hallo nochmal,

die Übersetzung mit extern "C" im Block (geschweifte Klammern) ist von mir auch eingesetzt worden. Leider bin ich nun auch etwas ratlos, da verschiedene HowTos auch keine Neuigkeiten verkünden.

Gibs irgendwo ein Tutorial zu Plugins unter Qt ? Ich kann mir momentan sehr wenig darunter vorstellen. Bin mit dieser Materie noch nicht in Berührung gekommen.

Verfasst: 5. April 2006 10:20
von Christian81
mosek hat geschrieben: Gibs irgendwo ein Tutorial zu Plugins unter Qt ? Ich kann mir momentan sehr wenig darunter vorstellen. Bin mit dieser Materie noch nicht in Berührung gekommen.
Soweit ich Dich verstanden habe willst Du eine Qt-Dll mit FoxPro verwenden, oder? Da hilft Dir imho Qt-Plugins nicht weiter.