florian0
Neu angemeldet
Hiho,
ich möchte in einer C++ Anwendung eine DLL verwenden. Diese DLL exportiert Klassen. Zur DLL existiert kein offizelles Lib-File für den Linker.
(Es handelt sich eine modifizierte Version von Ogre3D (OgreMain.dll) )
Ich habe nach dieser Anleitung ein Lib-File erstellt. Die spezifischen Klassen, die ich verwenden wollte, habe ich per Header definiert. Die restlichen Header habe ich aus dem OgreSDK gezogen. Sollte also erstmal kein Problem darstellen.
Der Compilier kompiliert das Programm und der Linker linkt brav. Doch einige Funktionen einer bestimmen Klasse sind falsch gelinkt. Schaut man sich das ganze auf Assembler-Ebene an, so stellt man fest, das die Funktionspointer um 4 Byte falsch berechnet werden. (Berechneter Pointer + 4 = Richtiger Pointer).
(Die Pointer sind ja als Liste einkompiliert. Ab einem bestimmen Punkt mitten in der Liste sind alle darauf folgenden Pointer um 4 Byte verschoben. So wie als würde da ein Eintrag zu viel sein ...).
(Edit: Evtl. etwas schwammig formuliert. Nicht der Pointer auf die Funktion selbst ist verschoben, sondern der Index auf die Liste. Daher wird immer die nächste Funktion gelinkt, statt die Richtige)
Ist für mich totales Neuland. Mein C++ war nie sonderlich gut und mein Wissen über den Linker ist sehr begrenzt. Keine Ahnung was da abgeht. Woran kann das liegen? Ich hab ne Menge Linker-Warnings bezüglich anderer Funktionen aus den OgreHeadern. Kann das damit zusammenhängen? Das sich der Linker da verrechnet?
Ich hab mir jetzt beholfen, in dem ich eine Wrapper-Klasse geschrieben habe. Diese führt den wohl kränksten Cast meines Lebens aus, um die Funktionen richtig zu mappen. Aber das kann ja wohl nicht die Lösung sein ...
Ich bin für jede noch so doofe Idee dankbar. Ich hab nämlich keine eigenen mehr.
Ich weiß nicht mal nach was ich suchen könnte.
Vielleicht hat jemand auch eine anschauliche Referenz zum Linker. Ich hab mir ein paar Bücher aus der Bibliothek geholt, aber die sind echt schwere Kost.
Windows 7 (32) + Visual Studio 2010 + WinSDK 7.1
OgreSDK 1.8
Kein CLR/ATL/MFC
(Falls jemand am genauen Hintergrund interessiert ist: Ich möchte die Archivdateien eines Spiels entpacken. Das Spiel ist in Ogre3D geschrieben und liefert eine DLL mit den entsprechenden Exports. Die nötigsten Funktionen funktionieren auch, aber das oben genannte Phänomen bereitet mir Kopfschmerzen).
Gruß
florian0
ich möchte in einer C++ Anwendung eine DLL verwenden. Diese DLL exportiert Klassen. Zur DLL existiert kein offizelles Lib-File für den Linker.
(Es handelt sich eine modifizierte Version von Ogre3D (OgreMain.dll) )
Ich habe nach dieser Anleitung ein Lib-File erstellt. Die spezifischen Klassen, die ich verwenden wollte, habe ich per Header definiert. Die restlichen Header habe ich aus dem OgreSDK gezogen. Sollte also erstmal kein Problem darstellen.
Der Compilier kompiliert das Programm und der Linker linkt brav. Doch einige Funktionen einer bestimmen Klasse sind falsch gelinkt. Schaut man sich das ganze auf Assembler-Ebene an, so stellt man fest, das die Funktionspointer um 4 Byte falsch berechnet werden. (Berechneter Pointer + 4 = Richtiger Pointer).
(Die Pointer sind ja als Liste einkompiliert. Ab einem bestimmen Punkt mitten in der Liste sind alle darauf folgenden Pointer um 4 Byte verschoben. So wie als würde da ein Eintrag zu viel sein ...).
(Edit: Evtl. etwas schwammig formuliert. Nicht der Pointer auf die Funktion selbst ist verschoben, sondern der Index auf die Liste. Daher wird immer die nächste Funktion gelinkt, statt die Richtige)
Ist für mich totales Neuland. Mein C++ war nie sonderlich gut und mein Wissen über den Linker ist sehr begrenzt. Keine Ahnung was da abgeht. Woran kann das liegen? Ich hab ne Menge Linker-Warnings bezüglich anderer Funktionen aus den OgreHeadern. Kann das damit zusammenhängen? Das sich der Linker da verrechnet?
Ich hab mir jetzt beholfen, in dem ich eine Wrapper-Klasse geschrieben habe. Diese führt den wohl kränksten Cast meines Lebens aus, um die Funktionen richtig zu mappen. Aber das kann ja wohl nicht die Lösung sein ...
Ich bin für jede noch so doofe Idee dankbar. Ich hab nämlich keine eigenen mehr.
Ich weiß nicht mal nach was ich suchen könnte.
Vielleicht hat jemand auch eine anschauliche Referenz zum Linker. Ich hab mir ein paar Bücher aus der Bibliothek geholt, aber die sind echt schwere Kost.
Windows 7 (32) + Visual Studio 2010 + WinSDK 7.1
OgreSDK 1.8
Kein CLR/ATL/MFC
(Falls jemand am genauen Hintergrund interessiert ist: Ich möchte die Archivdateien eines Spiels entpacken. Das Spiel ist in Ogre3D geschrieben und liefert eine DLL mit den entsprechenden Exports. Die nötigsten Funktionen funktionieren auch, aber das oben genannte Phänomen bereitet mir Kopfschmerzen).
Gruß
florian0
Zuletzt bearbeitet: