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
Freigeben: 2024-11-12 09:30:02
Original
731 Leute haben es durchsucht

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#@@@@")
Nach dem Login kopieren

Alternativ, um den dekorierten Funktionsnamen automatisch zu erhalten:

#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)
Nach dem Login kopieren

Äquivalentes externes „C“ mit Deklarationsspezifizierer

Ein anderer Ansatz besteht darin, externes „C“ mit einem Deklarationsspezifizierer zu verwenden:

extern "C" void __declspec(dllexport) SomeFunction();
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage