Hallo! Ich habe folgende Situation: Existerende DLL-Bibliothek (geschrieben in C) und existierender Header. Aus dieser Bibliothek wollte ich nun eine lib generieren, um diese in einem eigenen Programm zu linken und zu verwenden (Visual Studio 2013). Folgende Vorgangsweise habe ich gewählt: Mittels Dependency Walker (bzw. kontrolliert auch mit dumpbin) habe ich aus der DLL die Funktionsnamen (in der "E"-Spalte steht überall 'C', also alle Funktionen mit cdecl Aufrufkonvention oder?) und Ordinalzahlen extrahiert (zusammengefügt mittels Excel weil die Ordinalzahlen ja von @1... @186 laufen). Diese habe ich ein .def File kopiert, dass so aussieht: LIBRARY lib-name Init @1 Blabla @2 ... Anschließend folgender Aufruf von lib aus der VS-Konsole: "lib /def:mydefs.def /out:mylib.lib"... bis hierhin alles ok. Danach im Visual Studio ein Projekt gemacht, die Bibliothek gelinked (#pragma comment(lib, "mylib.lib")), die DLL befindet sich auch im Projektverzeichnis und der Header wurde eingebunden. Wenn ich jetzt allerdings eine Funktion aufrufen will, bekomme ich immer: "unresolved external symbol: _Init() in main" (die funktion heißt aber eigentlich Init() OHNE Unterstrich). Hat jemand eine Idee was ich falsch gemacht habe? Danke schonmal!
Heinz K. schrieb: > Existerende DLL-Bibliothek (geschrieben in C) und existierender Header. > Aus dieser Bibliothek wollte ich nun eine lib generieren, um diese in > einem eigenen Programm zu linken und zu verwenden (Visual Studio 2013). Beim Übersetzen der DLL sollte Deine gewünschte Import-Library abfallen, die Du verwenden kannst, ohne Dir mit Dependency-Walker & Co. irgendwas raussuchen zu müssen. Da Du die DLL im Quelltext vorliegen hast, sollte das möglich sein. Ansonsten muss man DLLs nicht unbedingt über Import-Libraries ansprechen, das geht auch mit Laden zur Laufzeit via LoadLibrary und GetProcAddress. Ist natürlich umständlicher, bietet aber den Vorteil, daß das eigentliche Programm auch dann eine Chance bekommt, etwas zu tun, wenn die DLL nicht vorhanden ist. Beim Verwenden von Importlibraries aber muss die DLL vorhanden sein, damit der Programmlader des Betriebssystems glücklich wird, und erst dann wird das eigentliche Programm gestartet. Wenn Du den DLL-Quelltext vorliegen hast, kannst Du natürlich auch auf das ganze DLL-Geraffel verzichten und die Funktionen direkt in Dein anderes Projekt übernehmen, oder eine normale (statische) Library draus machen.
Rufus Τ. F. schrieb: > Beim Übersetzen der DLL sollte Deine gewünschte Import-Library abfallen, > die Du verwenden kannst, ohne Dir mit Dependency-Walker & Co. irgendwas > raussuchen zu müssen. Da Du die DLL im Quelltext vorliegen hast, sollte > das möglich sein. Leider eben nicht. Der Header gehört eigentlich zu einer (statischen) .a Bibliothek vom gcc... Ich habe die Bibliothek (DLL und .a File) nur als Binary vorliegen. Damit ich das ganze mit der VS Toolchain nutzen kann, dachte ich eben, dass ich mir relativ einfach aus der DLL so eine Importlibrary erzeugen kann. Rufus Τ. F. schrieb: > Ansonsten muss man DLLs nicht unbedingt über Import-Libraries > ansprechen, das geht auch mit Laden zur Laufzeit via LoadLibrary und > GetProcAddress. Ist natürlich umständlicher, bietet aber den Vorteil, > daß das eigentliche Programm auch dann eine Chance bekommt, etwas zu > tun, wenn die DLL nicht vorhanden ist. Beim Verwenden von > Importlibraries aber muss die DLL vorhanden sein, damit der > Programmlader des Betriebssystems glücklich wird, und erst dann wird das > eigentliche Programm gestartet. Das habe ich bereits probiert und bekomme beim GetProcAddress immer null zurück, GetLastError liefert Error 127 (also "The specified procedure could not be found."). Hab aber gerade den Sourcecode für das Laden nicht da, kann ich nachreichen...
Heinz K. schrieb: > Das habe ich bereits probiert und bekomme beim GetProcAddress immer > null zurück Wie sehen denn die Symbole aus, die mit dumpbin /exports angezeigt werden?
Heinz K. schrieb: > unresolved external symbol: _Init() in main Heinz K. schrieb: > Danach im Visual Studio ein Projekt gemacht, die Bibliothek gelinked > (#pragma comment(lib, "mylib.lib")), die DLL befindet sich auch im > Projektverzeichnis und der Header wurde eingebunden. > > Wenn ich jetzt allerdings eine Funktion aufrufen will, bekomme ich > immer: "unresolved external symbol: _Init() in main" (die funktion heißt > aber eigentlich Init() OHNE Unterstrich). > > Hat jemand eine Idee was ich falsch gemacht habe? Danke schonmal! Header nicht nachbearbeitet?
1 | __declspec(dllimport) |
für alle Deklarationen im Header?
Hallo! Scheinbar hatte ich irgendein ein Problem mit der spezifizieren der Plattform. Seitdem ich bei beim lib-Befehl explizit "/machine:x86" sage und auch im VS setze, funktioniert es.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.