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 mit reimp eine *.a erstellen, einbinden und freuen

    2. bei vorhandener DLL mit pexports eine *.def aus der DLL extrahieren und dann mit dlltool die benötigte *.a erstellen

    3. "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_setDoubleValues

    Ich 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: dlltool

    Aus einem anderen Forum:

    LIB-File vorhanden:

    1. reimp -d test.lib
      -> dies erstellt ein DEF-File mit den für MinGW und cygwin kompatiblen Namen
    2. dlltool --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:

    1. 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 und pexports sind Teil der MinGW Utilities
    V0.4.1 download@sourceforge
    V0.3 download@sourceforge
    V0.2 download@sourceforge

    Keine 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.


Anmelden zum Antworten