visual studio dlls die klassen importieren in qt mit mingw

Alles rund um die Programmierung mit Qt
Antworten
Talonclaw
Beiträge: 3
Registriert: 11. Mai 2006 15:06

visual studio dlls die klassen importieren in qt mit mingw

Beitrag von Talonclaw »

hi all!

ich hab folgendes problem:

ich habe eine dll geschrieben (unter visual studio, da ich dafür den intel compiler brauchte) die eine klasse exportiert. diese möchte ich nun in mein qt project (compiliert mit gcc unter mingw) einbinden.

das ist an sich ja kein problem, einfach den header dazu und kompilieren.

das problem jedoch ergibt sich mit linken. anscheinend erzeugt der gcc compiler link symbole mit anderen namen, als dies msvc macht. das heißt egal auf welche weise ich versuche die symbole aus der dll zu exportieren, sie schauen immer anders aus, als diejenigen, die ich für das linken zur dll im gcc compiler benötige.

also: (ich habe eine klasse mit namen activeContour und die exportierende memberfunktion ist buildNewContour)

visual studio erzeugt eine dll in der die memberfunktion mit folgendem symbol indentifiziert ist:

?BuildNewContour@activeContour@@QAE_NP6A_NHPAE@Z@Z


das symbol jedoch das gcc mit demselben header erwartet ist:

ZN13activeContour15BuildNewContourEPFbiPhE



mein frage also:

kann ich irgendwie die dll im visual studio so ausgeben, dass sie die für gcc notwendigen symbole exportiert, bzw. kann ich irgendwie mir ein .a file erzeugen, welches mit der von visual studio erzeugten dll umgehen kann?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

C++ - Klassen kann man nicht compilerunabhängig exportieren - die DLL muss auch mit MinGW erstellt werden sonst geht das nicht.
Eventuell geht es noch als Qt-Plugin.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Re: visual studio dlls die klassen importieren in qt mit min

Beitrag von Shadow »

Talonclaw hat geschrieben:hi all!

ich hab folgendes problem:

[..cut..]

mein frage also:

kann ich irgendwie die dll im visual studio so ausgeben, dass sie die für gcc notwendigen symbole exportiert, bzw. kann ich irgendwie mir ein .a file erzeugen, welches mit der von visual studio erzeugten dll umgehen kann?
Nein, so einfach kann man keine Bibliotheken "mal eben" auf andere Plattformen portieren.
Um einige Unterschiede aufzuzeigen, solltest du dir mal den Link ansehen.
Ich empfehle Dir aber stark, nur Qt-Plugins zu benutzen, da diese garantiert auf jede von Qt unterstützte Plattform ohne Änderungen kompiliert werden können und der qt-interne Plugin-Mechanismus Mehrfachableitungen von Schnittstellen erlaubt. Durch diese Unterstützung kannst du mit Qt-Plugins noch wesentlich flexibler arbeiten, als das sonst im Allgemeinen der Fall wäre.
Talonclaw
Beiträge: 3
Registriert: 11. Mai 2006 15:06

Beitrag von Talonclaw »

hm ... wie kann ich dann daten aus der dll in das hauptprogramm bringen?

sagen wir mal eine dll soll ein feld aus 3d-koordinaten erzeugen. die größe ist zur laufzeit noch nicht bekannt. dann muss ich, wenn ich keine klasse verwenden kann, einen pointer auf so ein feld übergeben. das problem ist allerdings, dass anscheinend dll und hauptprogramm über 2 getrennte heaps verfügen, denn beim delete[] im hauptprogramm oder beim beenden desselben bekommt man dann immer schutzverletzungen, wenn die variable in der dll mit new einem speicherbereich zugewiesen wurde.

es funktionert auch nicht mit vector<_type> da auch dieses beim freigeben des speichers der innerhalb der dll allociert wurde eine schutzverletzung wirft, und ich sowieso skeptisch bin, ob man dann nicht wieder probleme beim portieren bekommt, wenn man c++ elemente in das c interface einbaut.
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von Shadow »

Talonclaw hat geschrieben:hm ... wie kann ich dann daten aus der dll in das hauptprogramm bringen?

sagen wir mal eine dll soll ein feld aus 3d-koordinaten erzeugen. die größe ist zur laufzeit noch nicht bekannt. dann muss ich, wenn ich keine klasse verwenden kann, einen pointer auf so ein feld übergeben.


Kannst du, solltest du aber nicht. :)
Talonclaw hat geschrieben: das problem ist allerdings, dass anscheinend dll und hauptprogramm über 2 getrennte heaps verfügen, denn beim delete[] im hauptprogramm oder beim beenden desselben bekommt man dann immer schutzverletzungen, wenn die variable in der dll mit new einem speicherbereich zugewiesen wurde.
Es gibt kein Problem. DLL's werden von Windows automatisch aus dem Spiecher entfernt bei Beendigung der Hauptapplikation.
Talonclaw hat geschrieben: es funktionert auch nicht mit vector<_type> da auch dieses beim freigeben des speichers der innerhalb der dll allociert wurde eine schutzverletzung wirft, und ich sowieso skeptisch bin, ob man dann nicht wieder probleme beim portieren bekommt, wenn man c++ elemente in das c interface einbaut.
Und ob das funktioniert. Um all diese Probleme zu umgehen, solltest du daher am Besten gleich Qt-Plugins verwenden. In einem Qt-Plugin können im Übrigen auch ganz normal QVectoren etc. an aufrufende Funktionen aus der Hauptapplikation zurückgegeben werden.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

du könntest versuchen es ähnlich wie bei dem MySQL Plug-in zu machen. Ob das klappt kann ich dir aber nicht versprechen.
Talonclaw
Beiträge: 3
Registriert: 11. Mai 2006 15:06

Beitrag von Talonclaw »

vielen dank erstmal ... hab es nun halbwegs auf die reihe bekommen.

musst einfach die datenfelder, die in der dll initialisiert werden dort global deklarieren, und einfach einen pointer darauf an das andere programm übergeben.
Antworten