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
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.
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.
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.
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?
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.
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?
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.
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.
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.