MSVC Library / DLL unter MinGW
-
Hallo allerseits!
Ich versuche hier gerade ein Codebeispiel für einen recht seltenen Gerätedriver mit MinGW zu kompilieren (wurde vom Hersteller bereitgestellt). Mit MSVC++ 2008 Express klappt es ohne weiteres, wenn ich alle mitgelieferten Header-Dateien und die LIBs (mit zugehörigen DLLs) verlinke. MinGW produziert aber zu jeder Klasse aus der Driverschnittstelle einen Linker-Error wie z.B.
[Linker error] undefined reference to `DoubleArray::DoubleArray()'
Nach einiger Webrecherche habe ich herausgefunden, dass manchmal/oft die LIBs nicht direkt mit MinGW funktionieren, sondern in *.a-Dateien umgewandelt werden müssen:
1. bei vorhandener LIB+DLL einfach mitreimp
eine *.a erstellen, einbinden und freuen2. bei vorhandener DLL mit
pexports
eine *.def aus der DLL extrahieren und dann mitdlltool
die benötigte *.a erstellen3. "irgendwelche Änderungen" an der *.def können nötig sein, weil die Namenskonventionen der Kompiler nicht so richtig zusammenpassen
Punkt 1 und 2 bringen weiterhin die Linker-Fehler. Punkt 3 ist wahrscheinlich meine letzte Chance, ich weiß aber nicht, was geändert werden müsste. Passend zum obigen Linker-Error hab ich mal alle ähnlich lautenden Einträge aus der DEF rausgeschrieben:
EXPORTS
??0DoubleArray@@QAE@ABV0@@Z
??0DoubleArray@@QAE@PANH@Z
??0DoubleArray@@QAE@XZ
??1DoubleArray@@QAE@XZ
??4DoubleArray@@QAEAAV0@ABV0@@Z
?getDoubleValues@DoubleArray@@QAEPANXZ
?setValues@DoubleArray@@QAEXPANH@Z
DoubleArray_Create
DoubleArray_Create_1
DoubleArray_Destroy
DoubleArray_copyDoubleValues
DoubleArray_getDoubleValues
DoubleArray_getElementAt
DoubleArray_getLength
DoubleArray_setDoubleValuesIch sehe da einfach nicht durch. Kann mir jemand weiterhelfen?
MfG, pHySiX_RuLeZ
-
Hallo ...
Da ich zZ vor anscheinend vor einem recht ähnlichen Problem stehe wollte ich nur mal fix fragen, wie genau die Punkte 1 und 2, die du erwähnt hast, gemacht werden.
Ich kenne mich mit Programmieren leider noch nicht wirklich aus
-
Mandel schrieb:
Ich kenne mich mit Programmieren leider noch nicht wirklich aus
Wem erzählst du das?
Ein bisschen Googlen bringt da eigentlich schon ziemlich viel:
Google: mingw msvc lib
Google: reimp
Google: dlltoolAus einem anderen Forum:
LIB-File vorhanden:
reimp -d test.lib
-> dies erstellt ein DEF-File mit den für MinGW und cygwin kompatiblen Namendlltool --input-def test.def --dllname test.dll --output-lib test.a -k
-> dies erstellt ein neues, hoffentlich zu MinGW kompatibles .a-File
3. test.a verlinken und kompilieren
nur DLL vorhanden:
pexports test.dll > test.def
-> dies erstellt einen .def-File mit den in der .dll vorhandenen Namen
2. (siehe oben)
3. (siehe oben)
dlltool
ist bei MinGW schon dabei.reimp
undpexports
sind Teil der MinGW Utilities
V0.4.1 download@sourceforge
V0.3 download@sourceforge
V0.2 download@sourceforgeKeine der drei Versionen funktioniert mit meinen DLLs/LIBs hier. Da sitz' ich nun, ich armer Tor, und bin so klug als wie zuvor.
-
OK, mittelfristig muss ich wohl doch Visual Studio zu verwenden oder den Gerätehersteller kontaktieren. Kurzfristig ist aber nur die erste Variante praktikabel - trotz, dass der MS Compiler an anderer Stelle rumspinnt. Sollte jemandem doch eine Lösung für die Umwandlung der Bibliotheken einfallen, immer her damit.
-
Ich habe mal mit mingw die Libs von DirectX verwendet und es hat funktioniert: http://www.c-plusplus.net/forum/viewtopic-var-t-is-257817.html
Vielleicht hilft es weiter...
-
@abc.w: Du hast doch aber die LIBs einfach verwendet, oder? Mein Problem ist eher, dass ich die Bibliotheken dem Linker übergebe und trotzdem "undefined references" erhalte. Mir ist aber neu, dass verschiedene Compiler auch verschiedene Headerfiles brauchen. Leuchtet zwar irgendwie ein, aber bisher hatte ich eigentlich immer nur einen Satz Header und wahlweise ".lib"- oder ".a"-Bibliotheken.
abc.w schrieb:
Habe es nun aufgegeben, mit mingw zu kompilieren. [...] Es scheint doch einfacher zu sein, Visual Studio 2008 mit dem Microsoft Compiler zu verwenden...
Aber scheinbar bist du zu einem ähnlichen Ergebnis gekommen wie ich. Übrigens fiel meine Wahl jetzt auf Code::Blocks in Verbindung mit dem MS-Compiler.