DLL mit MinGW und Codeblocks => kryptischen Funktionsnamen



  • Moin!

    Folgendes Problem: Ich habe eine größere Menge Linux Sourcecodes, die ich Windows potieren möchte und eine DLL, die mit sehr alten Versionen (2 Dateien) des Sourcecodes erstellt wird.

    Nun möchte ich beides zusammenlegen. Der neue Sourcecode besteht aus so um die 200 Dateien und ist in verschiedenen Verzeichnissen untergebracht. Visual C mag aber die Linux-Pfade nicht ("pfad/datei"), darum habe ich beschlossen Visual C nicht mehr zu mögen und installierte Code::Blocks mit MinGW.

    Der stellt sich bei "pfad/datei" nicht so an und erzeugt auch brav meine Library, aber leider heißen die Funktionen jetzt nicht mehr "Open" oder "Close", sondern "Z4OpenPc" und "Z5CloseP8TiffFile". Das ist ganz hübsch, aber leider nicht gewünscht, zumal sich nun die Programme, die die DLL benutzen, nun bei mir beschweren.

    Weiß jemand, wie ich MinGW abgewöhnen kann, die Datentypen in den Funktionennamen der DLL einzukodieren? Bei Visual C gab's dafür einen Schalter, ich bin sicher, den gibt's beim MinGW auch, aber ich weiß nicht, wie er heißt?!

    Vielen Dank!



  • Haben die Funktionen die __stdcall Aufrufkonvention?
    Ist das ein C++ Projekt oder C Projekt?



  • fraage schrieb:

    Haben die Funktionen die __stdcall Aufrufkonvention?

    WINAPI

    fraage schrieb:

    Ist das ein C++ Projekt oder C Projekt?

    C++, was wohl die Ursache darstellen dürfte.

    Das Problem ist hier, dass dahinter C++ Code liegt, auf den von der DLL aus zugegriffen wird, daher C++. Die DLL-Funktionen sind "C", aber arbeiten mit templates usw., also scheint der Compiler eine DLL mit C++-Interface zu erzeugen - was ich aber eben nicht will.

    Der Code wurde bisher nicht ernstzunehmend verändert, und mit VC lies es sich ja auch entsprechend kompilieren.

    Ich bin auch für alternative Ideen offen. Soll ich aus der API-Datei eine C-Datei machen, die Funktionen aus einer neuen C++ Datei rufen, um das Problem zu umgehen oder kennt jemand eine einfachere Alternative!?



  • Ich glaube bei __stdcall (WINAPI) muss man eine .def Datei benutzen.

    Da is'n Beispiel:
    http://support.microsoft.com/?scid=kb%3Ben-us%3B815065&x=9&y=13

    Und wenn es cpp Dateien sind muss man glaub ich extern "C" vor die Funktionen schreiben.



  • wenn du c++ benutztn willst wirst du da wohl nicht drumrumkommen, c++ macht das schliesslich ned zum spass sondern aus gutem grund. ansonsten extern c für die einzelnen funktionen oder die dll gleich als C kompilieren.



  • und glauber du laberst müll. was hat die aufrufkonvention mit irgendwelchen def dateien zu tun? es ist wurst egal ob die exportierte funktion stdcall cdecl fastcall oder was auch immer is.



  • ne bei stdcall wird der Funktionsname ein bisschen verändert!! da bin ich mir 100% sicher.



  • so habs nochmal ausprobiert. mit visual c++ 2005 express edition und ner c datei:

    __declspec(dllexport) int test() { return 0; }

    ➡ test

    __declspec(dllexport) int __stdcall test() { return 0; }

    ➡ _test@0

    __declspec(dllexport) int __fastcall test() { return 0; }

    ➡ @test@0



  • Wenn ich Funktionen mit:

    extern "C" int __declspec(dllexport) __cdecl foo()
    

    oder

    extern "C" int __declspec(dllexport) __stdcall foo()
    

    kennzeichne und

    -Wl,--export-all-symbols
    

    auf der Kommandozeile angebe dann werden die Namen nicht dekoriert.



  • natürlich wird der name verändert aber das hat nix mit dem exportieren von funktionen zu tun.


Anmelden zum Antworten