Kleine Lib Frage
-
Hallo,
ich habe ein paar kurze Fragen zu Libraries:
1. Sehe ich das richtig, dass es 2 Arten von Libs gibt: Statische .lib und dynamische Libs. Eine dynamische Lib besteht (aus Programmierersicht) aus einer Import .lib und einer .dll. Stimmt das?
2. Statisches Linken: Wenn ich in meinem Programm eine statische .lib linken will, füge ich einfach die .lib hinzu (in VS08 unter Linker->Input->Additional Dependencis) und dann fügt der Linker den Code aus der .lib in mein executable ein. Kann man das so sagen?
3. Dynamisches Linken: Bei einer dynamischen Lib steht der Code in der DLL. Will ich sie zu meinem Programm dazu linken, adde ich die Import .lib. Stimmt das?
4. Bei einer dynamischen Lib steht ja der Code in der DLL. Was genau steht eigentlich in der Import lib?
5. Sowohl eine statische Lib als auch die Importlib einer DLL haben die Endung .lib. Woher weiß der Linker, was ich jetzt meine. Wenn ich jetzt z.B. in VS08 bei Additional Dependencies eine foo.lib hinzufüge kann das doch einmal eine statische lib sein, in der der Code steht oder aber eine Importlib zu einer foo.dll. Woher weiß der Linker, was das für ne Lib is?
Danke!
-
Hallo,
zu 1-3: Ja
Zu 4:
Genau kann ich es nicht sagen. Aber auf jeden Fall alles, was der Linker wissen muß, um die EXE zu erzeugen. Die Importlibary ist außerdem Compilerspezifisch. D.h. Importlibaries, die mit Kleinweichtools erstellt wurden, funken nicht mit Linkern von Borland. Borland lieferte aber ein Tool mit, das aus DLLs die Importlibary erstellen kann.Zu 5:
Es gibt noch mehr Informationen über eine Datei als nur der Name. Wie wär's mit dem Inhalt? Es steht halt einfach in der Datei. Höchstwahrscheinlich im Dateiheader.mfg Martin
-
Eine DLL kann auch ohne Import-Lib und Header existieren und benutzt werden. Man lädt dann die DLL oder LoadLibrary und die benötigten Funktionen mit GetProcAddress. Ich denke, der entscheidene Unterschied ist, dass bei der Variante mit Lib die importierten Funktionen sofort beim Programmstart geladen werden. Mit der erstgenannten Methode wird die DLL erst geladen, wenn zur Laufzeit LoadLibrary ausgeführt wird. So kann man erreichen, dass man eine DLL nur lädt, wenn man sie auch braucht, und ansonsten den Speicherplatz spart.