Heim >Backend-Entwicklung >C++ >Warum werden C-DLL-exportierte Funktionsnamen manchmal dekoriert und wie kann ich nicht dekorierte Namen exportieren?
C-DLL-Export: Verzierte/verstümmelte Namen
Bei der C-DLL-Entwicklung wird erwartet, dass exportierte Funktionsnamen nach der Kompilierung unverziert erscheinen. Allerdings können dekorierte Funktionsnamen mit zusätzlichen Zeichen Anlass zur Sorge geben.
Ursache der Dekoration
Die angezeigte Dekoration ist ein Ergebnis des Namensverstümmelungsprozesses des Compilers. Beim Kompilieren von C-Code ändert der Compiler Funktionsnamen, um die Eindeutigkeit über überladene Funktionen oder verschiedene Kompilierungseinheiten hinweg sicherzustellen. Diese Verstümmelung umfasst zusätzliche Zeichen und Symbole.
Lösung mit Pragma-Kommentar
Um nicht dekorierte Funktionsnamen zu exportieren, ohne eine Moduldefinitionsdatei zu verwenden, kann ein Pragma-Kommentar eingefügt werden:
#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")
Alternativ, um den dekorierten Funktionsnamen automatisch zu erhalten:
#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)
Äquivalentes externes „C“ mit Deklarationsspezifizierer
Ein anderer Ansatz besteht darin, externes „C“ mit einem Deklarationsspezifizierer zu verwenden:
extern "C" void __declspec(dllexport) SomeFunction();
Diese Methode führt jedoch immer noch zum gleichen dekorierten Funktionsnamen.
Eliminierung des Postfix
Leider kann die Dekoration des Beitrags „=" nicht ohne Verwendung einer Moduldefinitionsdatei oder eines Pragma-Kommentars entfernt werden. Dieses Postfix gibt die dekorierte Version der Funktion an.
Problemumgehung für C#-Anwendungen
Während die nicht dekorierten Namen bevorzugt werden, können P/Invoke-Aufrufe in C# weiterhin mit durchgeführt werden der dekorierte Funktionsname. Geben Sie dazu beim Aufruf der Funktion den vollständig dekorierten Namen an.
Das obige ist der detaillierte Inhalt vonWarum werden C-DLL-exportierte Funktionsnamen manchmal dekoriert und wie kann ich nicht dekorierte Namen exportieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!