Nativen Code aus Managed Code aufrufen
-
Hallo,
ich habe eine native statische C++ Lib und eine Managed C++/CLI WinForms Anwendung (/clr). Beide Projekte kompilieren problemlos. Jetzt möchte ich aus meinem Managed Code eine Instanz einer Klasse aus der nativen Lib anlegen:
g_terrain = new herbst::scene::Renderer(renderer->device, "terrain513.raw", herbst::scene::HEIGHTMAP_RAW_U8, *g_cullLODDesc, 500, 50, 500);
Hier der native Code:
// Renderer.h namespace herbst { namespace scene { class Renderer { // other stuff... public: Renderer(ID3D10Device* d3d10Device, const CHAR* heightmapFilename, HEIGHTMAP_TYPE heightMapType, const CLDesc& cullingLODDesc, float scaleX, float scaleY, float scaleZ); // other stuff... }; // Renderer.cpp namespace herbst { namespace scene{ Renderer::Renderer(ID3D10Device* d3d10Device, const CHAR* heightmapFilename, HEIGHTMAP_TYPE heightMapType, const CLDesc& cullingLODDesc, float scaleX, float scaleY, float scaleZ) { // body.. }
Wenn ich jetzt das Managed Projekt "builden" will, kriege ich 2 Linkerfehler:
Quote:Error 41 error LNK2028: unresolved token (0A0002D1) "public: __thiscall herbst::scene::Renderer::Renderer(struct ID3D10Device *,char const *,enum herbst::scene::HEIGHTMAP_TYPE,struct herbst::scene::CLDesc const &,float,float,float)" (??0Renderer@scene@herbst@@$$FQAE@PAUID3D10Device@@PBDW4HEIGHTMAP_TYPE@12@ABUCLDesc@12@MMM@Z) referenced in function "public: bool __clrcall herbstEd::EditorForm::initializeEngine(void)" (?initializeEngine@EditorForm@herbstEd@@$$FQ$AAM_NXZ) Editorform.obj herbstEd
Error 42 error LNK2019: unresolved external symbol "public: __thiscall herbst::scene::Renderer::Renderer(struct ID3D10Device *,char const *,enum herbst::scene::HEIGHTMAP_TYPE,struct herbst::scene::CLDesc const &,float,float,float)" (??0Renderer@scene@herbst@@$$FQAE@PAUID3D10Device@@PBDW4HEIGHTMAP_TYPE@12@ABUCLDesc@12@MMM@Z) referenced in function "public: bool __clrcall herbstEd::EditorForm::initializeEngine(void)" (?initializeEngine@EditorForm@herbstEd@@$$FQ$AAM_NXZ) Editorform.obj
Ich habe nach diesem error LNK2028 gegoogelt und folgendes gefunden: http://msdn.microsoft.com/en-us/library/ms235590(VS.80).aspx . Da steht, dass das Problem entsteht, wenn man aus Managed Code (kompiliert mit /clr:pure) nativen Code aufruft, da sich die Calling Conventions unterscheiden (das Managad Binary benutzt __clrcall und der native code __cdecl).
Das versteh ich nicht, denn erstens benutz ich nicht /clr:pure, sondern /clr und 2. rufe ich noch zig anderen nativen Code auf und das klappt auch alles.
Wieso gibt es den Linkerfehler bei diesem einen Konstruktor?
-
Hast Du Renderer.cpp auch in deinm Projekt aufgenommen?
Wird es kompiliert (kannst Du schauen ob ein Renderer.obj erzeugt wird)?Simon
-
Hallo,
Ja, Renderer.h und Renderer.cpp sind in dem nativen C++ Lib Project drinnen (per Add -> Existing Items). Habe gerade den Output Ordner gelöscht und beim Build der Lib entsteht sowohl ein Renderer.obj als auch die lib. Ich habe gerade als Test Renderer eine statische Methode hinzugefügt. Wenn ich die dann im Managed C++/CLI Code aufrufe:
int test = herbst::scene::Renderer::method();
klappt alles! Kein Linkerfehler. Aber sobald ich ein Objekt Renderer anlegen will, kriege ich den Linkerfehler. Ich versteh das einfach nicht.
-
Macht diese statische Klasse eigentlich was? Nicht, dass da etwas wegoptimiert wird.
Hast Du gegen die Lib gelinkt?
Eigenschaften -> Linker -> Eingabe ->Zusätzliche Abhängigkeiten?