Forum: PC-Programmierung VC++ Nicht aufgelöstes externes Symbol


von Peter (Gast)


Lesenswert?

Hallo,

ich habe hier eine statisch .lib (Visual Studio C++ 2010) erstellt und 
will die nun in einem anderen Projekt statisch einbinden.

Ich habe nun im Visual Studio bei den Zusätzlichen Abhängigkeiten des 
Linker die .lib angegeben und trotzdem sagt er mir:

Nicht aufgelöstes externes Symbol "__imp__Init@4"

Wenn ich ihm neben der .lib auch noch die DLL vorwerfe, dann geht es. 
Aber ich will eben statisch linken.

Was läuft da schief?

Gruß Peter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter schrieb:
> Wenn ich ihm neben der .lib auch noch die DLL vorwerfe, dann geht es.

Unwahrscheinlich. Der Linker interessiert sich nicht für DLLs, der will 
Libraries sehen.
Anscheinend enthält keine der von Dir dem Linker vorgeworfenen Libraries 
das Symbol "__imp__Init@4".

Der Name des Symboles allerdings deutet darauf hin, daß das eine 
Importlibrary ist, Du also gar nicht statisch linkst.

von Peter (Gast)


Lesenswert?

Kurze Korrektur:
Es funktioniert, wenn ich eine DLL erstellen und die dabei generierte 
Lib zusammen mit der DLL verwende. Die Lib hat dabei nur 4 kB.
Wenn ich die 'reine' Lib verwende (also statisch gelinkt), dann hat die 
Lib zwar 450 kB, aber es kommt eben die Fehlermeldung.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter schrieb:
> Wenn ich die 'reine' Lib verwende (also statisch gelinkt), dann hat die
> Lib zwar 450 kB, aber es kommt eben die Fehlermeldung.

Das mag der Unterschied der Libraries untereinander sein, aber Dein 
Projekt, in dem Du die Library verwenden möchtest, geht von einer 
Import-Library aus, und deswegen verwendet es die falschen Symbolnamen.

von Peter (Gast)


Lesenswert?

Die DLL bzw. Lib habe ich mit
 extern "C" __declspec(dllimport)
vor den Funktionsrümpfen im Header erstellt.

Wenn ich jetzt die Header Datei im Projekt wie folgt anpasse:
 extern "C"
kann ich auch gegen die statische Lib linken und benötige keine DLL 
mehr.

Allerdings ist mir nicht ganz klar, was da dahinter steckt und ich frage 
mich, ob ich mir somit eine neue Baustelle eröffne, wie z.B. läuft das 
auch auf anderen PC's?

Übrigens ist die DLL/LIB ohne CLR-Unterstützung erstellt.

Ich vermute mal, da ich auf CLR verzichte, läuft das auf jedem Windows, 
oder?

von Vlad T. (vlad_tepesch)


Lesenswert?

die sourcen deiner Lib - sind das .c oder .cpp files?

falls ersteres muss undebedingt ein
#ifdef __cplusplus
extern "C" {
#endif

und

#ifdef __cplusplus
}
#endif

um alle deklarationen deiner Header - unabhängig ob statisch, dynamisch 
oder überhaupt lib. gewöhn dir das bei C-Headern an, das vermedeit 
Probleme, wenn man doch irgendwann mal den header aus einem cpp file 
einbindet.

wenn du eine statische lib erstellst, darf in den headern auch nix in 
__declspec(dllimport) aufgelöst werden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter schrieb:
> Die DLL bzw. Lib habe ich mit
>  extern "C" __declspec(dllimport)
> vor den Funktionsrümpfen im Header erstellt.

Naja, genau das sagt, daß Du eine Importlibrary verwendest.

Und wenn Du es richtig machst

> Wenn ich jetzt die Header Datei im Projekt wie folgt anpasse:
>  extern "C"
> kann ich auch gegen die statische Lib linken und benötige keine DLL
> mehr.

dann geht's ja auch.

Und das statisch gelinkte Resultat läuft auf jedem PC, auf dem die 
restlichen Abhängigkeiten erfüllt sind - da die bewusste DLL nicht 
genutzt wird, muss sie auch nicht anwesend sein etc.


BTW: Wo kommt eigentlich die Sprachmarotte her, daß manche Leute gegen 
eine Library linken?

von Rolf Magnus (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> BTW: Wo kommt eigentlich die Sprachmarotte her, daß manche Leute gegen
> eine Library linken?

Anglizismus, da man im Englischen "against a library" linkt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Anglizismus, da man im Englischen "against a library" linkt.

Hmm. Dann eher ein Marottenanglizismus, da man auch im Englischen sehr 
wohl "with a library" linken kann.

von Peter (Gast)


Lesenswert?

Vielen Dank für die Hilfen. 'Importlibrary' hat mich auf die Idee 
gebracht.

>die sourcen deiner Lib - sind das .c oder .cpp files?
.cpp

ich hab das im Header so gemacht:
#ifndef MYLIB
#define MYLIB extern "C" __declspec(dllimport)
#endif

Und im .cpp:
#define MYLIB extern "C" __declspec(dllexport)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Peter schrieb:
> #define MYLIB extern "C" __declspec(dllimport)

Das gehört da aber nur hin, wenn Du eine Importlibrary für eine DLL 
verwenden willst.

Da Du aber statisch linken willst, muss das "__declspec(dllimport)" weg.

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.