G++ DLL's erstellen



  • Hallo,

    ich habe mir unter Linux ein paar Klassen geschrieben und erzeuge daraus shared-object-libraries (.so) und schließlich eine executeable, welche die .so-files benutzt - alles kein Problem.

    Jetzt will ich das Programm auch unter Windows kompilieren...
    gibt es eine gute Anleitung, wie ich DLL's erzeuge?

    z.Z. habe ich mir Dev-C++ installiert, und benutze wie unter Linux den g++

    allerdings bekomme ich da linkerfehler, die sich mir einfach nicht erschließen:

    ~MyRunnable()]+0x58):MyThread.cpp: variable 'vtable for MyRunnable' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.
    

    was ist dieses '--enable-auto-import' und was tut es und wo kann ich das nachlesen?

    Außerdem bekomme ich auch 'multiple definition' fehler

    Verstehe nicht, warum das unter windows so kompliziert ist



  • Die DLL erzeuge ich so:

    g++.exe -o libMy.dll $(OBJEKTE) $(IMPPRJLIBS) -s -shared -Wl,--subsystem,windows,--out-implib,libMy.lib,--enable-auto-import
    


  • DEV 4.9.9.2 oder älter? Da ist nur ein älterer MinGW 3.4.? darunter.

    Ausserdem haben die alten DEV den Ruf, den Compiler nicht immer richtig anzusteuern.

    Abhilfe: http://orwellengine.blogspot.de/
    Hab die Version noch nicht getestet. Aber da ist schon mal ein 4er MinGW dabei.
    Alternativen gibt es einige. Z.B. Code::Blocks 10.05 kann alte DEV-Projekte importieren. Aber den MinGW 4.4.1 bei Code::Blocks solltet ihr am besten nicht nutzen und einen aktuellen MinGW einbauen. Müsst ihr nachsehen z.Z. 4.6.3?

    Kannst du deinen Quellcode so klein bekommen, das praktisch nur die Fehlermeldung reproduziert wird? Wenn das überschaubar bleibt, den Quellcode hier einstellen.

    Hab vor Monaten auch schon mal etwas zu MinGW und DLL's gesucht. Die Infos im Netz sind zwar zahlreich, aber nur selten hilfreich. Oder ich hab fast immer die Falschen gefunden.

    MfG f.-th.



  • Ja ist ein MinGW 3.4.2

    werde mal sehen, dass ich eine neuere version finde.
    danke für den hinweis



  • Nebenbei ist zu beachten, dass in Shared Objects alles standardmäßig exportiert wird, wenn man Symbol nicht explizit versteckt (__attribute__((hidden))).

    In einer DLL ist es genau umgedreht:
    Wenn du etwas exportieren willst, musst du das sagen.

    Unter MSVC geht das per __declspec(dllexport), welches auch MinGW unterstützt.
    Die reine MinGW Lösung ist __attribute__((dllexport)).

    Alternativ gab es auch noch die Möglichkeit eine *.def Datei zu verwenden und dort die zu exportierenden Funktionen anzugeben.
    Hab die Methode selbst aber nie verwendet, weshalb ich dir darüber nichts genaueres sagen kann.



  • So - habe jetzt ein MinGW 4.6.2 das kompilieren funzt jetzt astrein. THX

    Hi, DrakoXP - habe vor jeder Klasse ein "__declspec(dllexport)" stehen. 😉


Anmelden zum Antworten