Wenn ich erklären, eine Funktion wie folgt aus:DLL mit __stdcall ohne Namen Dekoration: Warum funktioniert es überhaupt?
#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif
TESTAPI int __stdcall myadd(int a, int b);
Das Symbol in der DLL ist [email protected]
, die mir durchaus Sinn macht (nach wenigen Stunden des Lesens andere Fragen hier, das ist).
Aber die Windows-Bibliotheken scheinen etwas anderes zu tun. Sie verwenden auch __stdcall
(getarnt als WINAPI
), aber die Symbole in den DLLs haben keinen Namen Dekoration. Wenn die obige Methode in den Windows-Bibliotheken wäre, wäre das Symbol myadd
.
Meine Vermutung ist, dass sie eine def-Datei verwenden, um die Symbole zu aliasieren. Aber warum weiß mein Linker das, wenn ich auf eine dieser DLLs verlinke?
Die Windows-Header-Dateien deklarieren diese Funktionen mit WINAPI
, also wenn ich sie aufrufen, sollte der Linker nach dem verzierten Namen suchen, da es eine __stdcall
-Funktion ist. Doch irgendwie weiß der Linker, dass er die Namensdekoration fallen lässt.
Ich habe versucht, dies zu replizieren, indem Sie eine kleine DLL schreiben und die Namensdekoration mit einer def-Datei entfernen. Wie erwartet, bekomme ich Linkfehler, da der Linker immer noch nach dem dekorierten Namen sucht. Ich habe das in reinem C getan, um sicherzustellen, dass C++ Name Mangling es nicht beeinflusst.
edit: zu klären, MSVC 14,0/VS2015, 32-Bit-
Beachten Sie, dass x64 keine Namensdekoration verwendet. –
@ JonathanPotter: * "Beachten Sie, dass x64 keine Namen Dekoration verwendet." * - Das ist nur für 'extern" C ". C++ - Symbole müssen Exportnamen für die Überladungsauflösung aufweisen. – IInspectable