Undefined Reference trotz lib-File

OP #4430482
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!
Persönliche Seite #4430493
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.
OP #4430579
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...
Gast #4430680
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren