[LNK2019] Keine Idee mehr (calling conventions)



  • Hi,

    bin gerade mit meinen Ideen am Ende. 😞

    Hab in Erinnerung, dass es öfters Topics zum LNK2019 gab, aber die Hilfe spuckt grad nichts aus.

    Also ich hab eigene Libs eingebunden, und dann kommt eben der Fehler. Die augerufenen Fkt. existieren, die .lib-Dateien sind an dem richtigen Ort, aber der Linker beschwert sich. Hab auch mal mit der Option "Runtime-Library" rumgespielt, aber hat nichts gebracht.

    Was gibt's sonst noch zu beachten ?

    Danke,
    don_basto.



  • die calling conventions einhalten, also __cdecl oder __stdcall usw. und bei gemischten files (c und cpp) das extern "C" verwenden



  • Danke, danke. 👍

    Die Calling Conventions waren's. Danke für den Tipp. 🙂



  • Bin nicht ganz hinter die Aufrufkontionseinstellungen gestiegen. Jetzt habe ich das Problem, dass ich keine einheitliche Aufrufkonvention verwenden kann. Beide Projekte müssen ihre Konventionen behalten.

    (1) Plugin, welches __stdcall(/GZ) verwendet, was sich nicht ändern lässt, da es sonst nicht korrekt arbeitet.
    (2) DLL, welche __cdecl(/GD) verwendet, was sich nicht ändern lässt, da sich die DLL sonst nicht verwenden lässt.

    Gibt es eine Lösung, dass beide Projekte trotzdem zusammenarbeiten?



  • warum ist das ein problem? ein code der __cdecl verwendet, kann __stdcall funktionen aufrufen und umgekehrt.



  • Aber Linker macht da nicht mit! 😞

    - Benutze ich für die DLL __stdcall, werden externe Libs nicht mehr gelinkt.
    - Wenn ich beim Plugin die Kompiler-Einstellung auf __cdecl setzt, freut sich der Linker, aber das Plugin wird nicht mehr on seiner Anwendung erkannt.
    - Wird das Plugin mit __stdcall gelinkt, werden die Fkt. der DLL nicht mehr erkannt. Genau das verstehe ich nicht. Zum Exportieren und Importieren der DLL-Fkt. verwende ich __declspec(). Damit könnte eigentlich alles geregelt sein, aber scheinbar nicht.

    Hab im MSDN einen Betrag zum Verhalten von __declspec(dllexport) gefunden. Danach werden je nach Aufrufkonvention die Namen unterschiedlich ergänzt. Leider stand nichts zum __declspec(dllimport).

    Hat jemand einen Tipp?

    [EDIT]
    Hab folgende Namensergänzung für die DLL-Fkt.:

    __imp__myFunc@32	// Plugin (__stdcall)
    _myFunc			// DLL (__cdecl)
    

    Wie kann ich dem Plugin sagen, dass es in dem fall der DLL __cdecl nehmen soll?
    [/EDIT]



  • Die Lösung ist ganz einfach:

    __declspec(dllimport) void __cdecl myFunc(int);
    

    Das __cdecl vor dem Fkt.-namen wird gegenüber der Projekteinstellung(__stdcall) bevorzugt.

    Gruß, 🙂
    don_basto.


Anmelden zum Antworten