2016-06-16 22 views
0

Um eine statische Bibliothek zu verknüpfen, muss ich .lib aus .h und .c Dateien erstellen. Dann füge ich es meinem Projekt hinzu, setze zusätzliche Abhängigkeiten ein und kompiliere.Wie verlinke ich die DLL im Visual Studio?

Um dll zu verwenden, brauche ich .dll und .lib. Diese .lib ist die gleiche wie oben oder anders? Wie sagt man zu Visual Studio, um .dll und .lin, nicht nur .lib zu verwenden? Ich legte .dll in das Projektverzeichnis und nichts änderte (.exe hat die gleiche Größe (sollte weniger sein, denke ich)).

+1

Ein DLL-Projekt generiert eine * import * -Bibliothek. Es ist nicht dasselbe wie eine statische Bibliothek, es ist sehr klein und deklariert nur die Funktionen, die Sie exportiert haben. Wenn Sie keine .lib-Datei erhalten, haben Sie sie nicht korrekt erstellt oder Sie haben vergessen, Funktionen zu exportieren. –

+0

DLL-Projekt erstellt nur die DLL-Datei. Ich kann keine .lib-Dateien finden – Stark

Antwort

2

Wenn Sie ein DLL-Projekt kompilieren, erhalten Sie eine DLL und eine LIB-Datei als Ausgabe. Die DLL enthält den eigentlichen Bibliothekscode. Die LIB-Datei enthält Stubs für die exportierten Funktionen, die den Linker beim Senden von Code zum Aufrufen dieser DLL unterstützen.

Dies unterscheidet sich sehr von der LIB-Datei, die Sie beim Kompilieren einer statischen Bibliothek erhalten. Die LIB-Datei enthält den gesamten Objektcode, der die Bibliothek enthält. All dieser Code wird beim Erstellen direkt mit Ihrer ausführbaren Datei verknüpft - daher der "statische" Teil des Namens.

Die tatsächliche Art der Nutzung ist jedoch sehr ähnlich. Unabhängig davon, ob Sie eine Verknüpfung zu einer dynamischen oder statischen Bibliothek herstellen, verweisen Sie den Linker (über "Zusätzliche Abhängigkeiten") auf die LIB-Datei. Der Linker erledigt den Rest; Es kann aus der LIB-Datei erkennen, was es tun soll.

Natürlich müssen Sie sicherstellen, dass es die richtige LIB-Datei ist. Wenn Sie beide Projekte (die DLL und die EXE) in derselben Lösung verwenden, können Sie Projektreferenzen verwenden, was die Aufgabe im Wesentlichen narrensicher macht.

EDIT: Sie erhalten natürlich keine LIB-Datei, wenn Sie eine DLL erstellen, es sei denn, die DLL exportiert Funktionen. (Wenn es keine Funktionen exportiert, gibt es nichts, was ein Client dieser DLL aufrufen kann. Es gibt also keinen Grund für eine LIB-Datei!) Die einfachste Möglichkeit, Funktionen zum Exportieren aus einer DLL anzuordnen, ist die __declspec(dllexport) Annotation . Wenn Sie mit einem Makro kombiniert werden, können Sie dafür sorgen, dass es auf der Verbraucherseite in __declspec(dllimport) aufgelöst wird, sodass Sie die gleiche Header-Datei sowohl zum Erstellen der DLL als auch zum Verwenden von einer Anwendung verwenden können. Mehr Informationen dazu in meiner Antwort here. Alternativ können Sie a DEF file with an "EXPORTS" section verwenden.

+0

Nach dem Erstellen und Kompilieren von DLL-Projekt (von .c und .h-Dateien) bekomme ich nur die .dll-Datei. Es gibt keine .lib. – Stark

+0

Und noch eine Frage: Wie verwendet man vorkompilierte .dll ohne .lib-Datei, die ich von einer Seite heruntergeladen habe, die die Bibliothek hostet? Soll ich LoadLibrary- und GetProcAddress-Funktionen verwenden? – Stark

+1

@stark Es funktioniert für mich. Ich habe Folgendes getan: Fügen Sie der Lösung ein neues Projekt hinzu und geben Sie die Vorlage "Win32 Project" an. Im Assistenten wählte ich "DLL". Ich habe alle Funktionen kommentiert, die ich mit '__declspec (dllexport)' aus der DLL exportieren möchte, und dann habe ich das Projekt erstellt. Im Ausgabeordner bekomme ich 'MyDLL.dll',' MyDLL.exp', 'MyDLL.ilk',' MyDLL.lib' und 'MyDLL.pdb'. Ich nehme an, dass Ihr Problem darin besteht, dass Sie keine Funktionen aus der DLL exportieren. Das macht die DLL ziemlich nutzlos. –

1

Statische LIB oder (kleine) LIB mit einer DLL, beide würden eine Header-Datei (oder explizite Funktionsdeklarationen) benötigen. Allerdings ist der Unterschied zwischen LIBs:

  • (dynamisch) DLL: Die LIB wie eine Header-Datei ist, und die DLL-Datei ist wie eine CPP-Datei. Genau wie der Header, der die Deklaration enthält, enthält .LIB Importdefinitionen. Genau wie CPP die Definitionen enthält, enthält die .DLL den tatsächlichen Code.
  • Statische LIB: Genau wie ganze Klasse in .H (meist im Falle von Vorlagen) implementiert, und keine angehängte .CPP-Datei - diese Art von LIB enthält den gesamten Code für das Programm zu arbeiten. Genauso, der Linker wird sich nicht über fehlende Implementierung beklagen (.CPP im obigen Fall), der Loader (OS) wird sich über fehlende DLL nicht beschweren.

    DLL basierte libs sind klein, statische libs sind groß (setzen Sie die .H/.CPP Analogie hier).