2017-04-22 1 views
0

Ich habe eine .so-Datei, und ich muss die Methode in meinem C++ - Code verwenden. Es gibt keine Header-Datei. Ich dekompiliere die notwendigen Symbole nach nm und die gefundenen Methoden- und Klasseninformationen sind wie folgt.Verwenden von .so-Datei ohne Header-Datei

00000000002ec9c0 B CFTDOrderField::m_Describe 
0000000000067440 W CFTDOrderField::DescribeMembers() 

Nach meinem Studium, ich denke, ich sollte dynamische Ladelösung verwenden. Aber ich habe keine Ahnung, wie man den Rückgabetyp von dlsym definiert, kann mir jemand einen Hinweis oder eine Lösung geben? Vielen Dank!!

+0

'dlopen/dlsym' haben keinen Vorteil gegenüber 'normaler' Verknüpfung; Außerdem ersetzen sie nicht die fehlende Header-Datei, die Sie neu erstellen müssen - es wird nicht einfach sein. Es könnte auch gegen das Urheberrecht verstoßen. –

Antwort

-1

Es ist keine triviale Aufgabe. Generell gesagt, Sie können nicht einfach dlsym hier verwenden. Im Gegensatz zu C, C++ - Mangelsymbolnamen können Mangling-Standards von Implementierung zu Implementierung und sogar von Version zu Version desselben Compilers variieren. Sie können weiterhin Funktionen verwenden, die gemäß C-Konventionen exportiert wurden, aber ich fürchte, die Verwendung ganzer Typen (C++ - Klassen) wäre ohne Header nicht möglich.

Lazy Laden und Verwenden von gemeinsamen Objekten Klassen zu exportieren war in C++ immer ziemlich schwierig. Sie können spezielle Funktionen wie in this Tutorial verwenden, oder Sie können erweiterte Techniken wie factories verwenden, schließlich können Sie sich auf Ihren Compiler/Linker verlassen (alle gängigen modernen Compiler unterstützen dies), aber so oder so Sie brauchen einige Informationen über Typen, die Sie ' Dieses Programm sollte in Ihrem Programm verwendet werden und diese Informationen sollten zur Kompilierzeit verfügbar sein. Diese Informationen sind in den Header-Dateien enthalten. Also, die Antwort auf Ihre Frage ist eher negativ.

Auf Name Mangling und warum es "böse" ist, siehe Links in Kommentaren. (Nimm das nicht zu wörtlich - es gibt technische Gründe dafür, auch wenn diese Funktion manchmal das Leben schwieriger macht :-))

+0

Hallo, @rfx, ich verstehe deine Aussage nicht. Könnten Sie dazu beitragen, mehr Details zu erklären? – user2933783

+0

Entschuldigung. http://www.geeksforgeeks.org/extern-c-in-c/ das kann etwas Licht und geben Sie eine Idee, worüber ich spreche und warum 'dlopen' auf gemeinsame Objekte in C++ geschrieben ist schwierig. Sie können diesen Artikel auch hilfreich finden https://en.wikipedia.org/wiki/Name_migling. – rfx

Verwandte Themen