3 Stimmen

Ist es möglich, eine Bibliothek dynamisch zu verknüpfen wie eine DLL?

Dies ist eine Interviewfrage.

Ist es möglich, eine Bibliothek dynamisch wie eine DLL zu verknüpfen?

Zum Beispiel, für eine DLL verwenden wir LoadLibrary und rufen exportierte Funktionen auf. Ist es möglich, eine lib-Datei auf ähnliche Weise zu verwenden?

5voto

Nawaz Punkte 339767

Nein. Die Bibliotheken .lib werden statisch verknüpft, und das ist der Zweck, für den sie erstellt wurden, um die Namenssymbole zur Verknüpfungszeit mittels des Linkers aufzulösen, und die Verknüpfungszeit erfolgt vor der Laufzeit. Sie werden oft als "statische Bibliotheken" bezeichnet (deshalb habe ich diesen Tag in deine Frage hinzugefügt!). Das ist die kurze Geschichte von lib.

Du kannst jedoch einen DLL-Wrapper erstellen, wenn du wirklich zur Laufzeit verknüpfen möchtest.

2voto

wilx Punkte 17189

Nein. Erstellen Sie stattdessen eine DLL oder, wenn Sie nicht über den Quellcode verfügen, verpacken Sie die Funktionalität in der .lib mit der eigenen DLL-Schnittstelle.

1voto

harper Punkte 12802

Nein. Es ist nicht möglich. Eine DLL ist ein Modul mit einem PE32-Header mit allen Informationen zum Laden in einen Prozess. Eine LIB ist nur ein Archiv von OBJ-Dateien.

Und obwohl andere sagen, es sei einfach, eine DLL darum zu wickeln, kann dies recht schwierig sein. Der Grund dafür ist, dass eine .LIB nicht nur einige Abhängigkeiten auflöst, sondern auch ungelöste externe Verweise haben kann.

Solange diese ungelösten externen Verweise nur die Laufzeitbibliothek des Compilers erfordern, könnte das Einwickeln in eine DLL funktionieren. Sie können dies überprüfen, wenn Sie ein DLL-Projekt erstellen, wahrscheinlich mit einem minimalen C++-Quellcode, und versuchen zu kompilieren. Dann sehen Sie, ob weitere externe Verweise mit anderen Bibliotheken aufgelöst werden müssen.

Ein wichtiges Problem könnte bei der Speicherverwaltung auftreten. Wenn Sie statisch mit einer .LIB verlinken, verwenden Sie alle die gleichen Definitionen. Wenn Ihre Bibliothek eine eigene Implementierung mitbringt, sagen wir mal von malloc-ähnlichen Funktionen, wird dies nicht mit Ihrer Anwendung verlinkt, solange Sie all diese Symbole zur EXPORT-Liste hinzufügen. Das Finden der Liste der öffentlichen Symbole, die in die EXPORT-Tabelle aufgenommen werden sollen, kann sehr mühsam sein.

0voto

JoeG Punkte 12744

Ja - nicht direkt, aber mit einer sehr geringen Menge an Arbeit.

Erstellen Sie ein neues .DLL-Projekt, verknüpfen Sie die .lib, definieren Sie welche Funktionen Sie in einer .DEF-Datei exportieren möchten und kompilieren Sie dann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X