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?
visual studio dlls die klassen importieren in qt mit mingw
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Re: visual studio dlls die klassen importieren in qt mit min
Nein, so einfach kann man keine Bibliotheken "mal eben" auf andere Plattformen portieren.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?
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.
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.
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.
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.
Es gibt kein Problem. DLL's werden von Windows automatisch aus dem Spiecher entfernt bei Beendigung der Hauptapplikation.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.
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.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.
-
BartSimpson
- Beiträge: 1379
- Registriert: 6. November 2004 12:03
- Kontaktdaten: