Forum: PC-Programmierung Undefined Reference trotz lib-File


von H. K. (spearfish)


Lesenswert?

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!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von H. K. (spearfish)


Lesenswert?

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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Jay (Gast)


Lesenswert?

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?

von H. K. (spearfish)


Lesenswert?

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
Noch kein Account? Hier anmelden.