Heim >Backend-Entwicklung >C++ >Warum werden C-DLL-exportierte Funktionsnamen manchmal dekoriert und wie kann ich nicht dekorierte Namen exportieren?

Warum werden C-DLL-exportierte Funktionsnamen manchmal dekoriert und wie kann ich nicht dekorierte Namen exportieren?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-12 09:30:02706Durchsuche

Why are C   DLL exported function names sometimes decorated, and how can I export undecorated names?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn