Wie erstelle ich eine Importbibliothek (.lib) UND eine DLL in Visual C ++?

74

Ich möchte ein einzelnes Visual Studio-Projekt haben, das eine DLL-Datei und eine Importbibliotheksdatei (.lib) erstellt. (Eine Importbibliothek ist eine statisch verknüpfte Bibliothek, die das Laden dieser DLL-Datei in andere Projekte übernimmt, die sie verwenden.)

Also ging ich zu Visual Studio C ++ 2008 Express Edition, erstellte ein neues Projekt vom Typ Klassenbibliothek und setzte den "Konfigurationstyp" auf "Dyanamic Library (.dll)".

Wenn ich die Lösung erstelle, ist die einzige relevante Ausgabedatei, die ich sehe, eine DLL-Datei. Ich sehe keine LIB-Datei, die generiert wird. Ich habe im Projektverzeichnis und in allen Unterverzeichnissen (Release und Debug) gesucht.

Ich glaube, dass es möglich ist, eine LIB und eine DLL-Datei gleichzeitig zu erstellen, da auf der MSDN steht: "Der Linker erstellt die Importbibliothek, wenn die DLL erstellt wird." Ein anderer Benutzer dieser Website erstellt gleichzeitig LIB- und DLL-Dateien mit Visual C ++ .

Wie kann ich das machen?

David Grayson
quelle
4
Ich hatte gerade genau dieses Problem, bei dem meine LIB-Datei nicht generiert wurde. Nachdem ich alle Informationen durchgesehen hatte, die ich über mögliche Ursachen finden konnte, und alle Antworten unten sorgfältig durchgesehen hatte, stellte ich schließlich fest, dass dies daran lag, dass meine CPP-Datei meine H-Datei nicht enthielt. :( Wirf es einfach hier raus, damit mein Kommentar (mit einer geringen Wahrscheinlichkeit) jemandem / mir helfen kann, wenn mein dummer Fehler in ferner Zukunft wiederholt wird ...
user1884905

Antworten:

24

Durch Auswahl von 'Klassenbibliothek' haben Sie versehentlich angewiesen, eine .NET-Bibliothek mit der CLI-Erweiterung (verwaltet) von C ++ zu erstellen.

Erstellen Sie stattdessen ein Win32-Projekt und wählen Sie in den Anwendungseinstellungen auf der nächsten Seite "DLL".

Sie können aus diesen Bibliotheksoptionen auch eine MFC-DLL oder eine ATL-DLL erstellen, wenn Sie diesen Weg gehen möchten, aber es hört sich so an, als ob Sie dies nicht tun.

Joe
quelle
84

Hat Ihr DLL-Projekt tatsächlich Exporte? Wenn keine Exporte vorhanden sind, generiert der Linker keine .lib-Datei der Importbibliothek.

In der Nicht-Express-Version von VS wird der Name des Import-Librays in den Projekteinstellungen hier angegeben:

Configuration Properties/Linker/Advanced/Import Library

Ich gehe davon aus, dass es in Express dasselbe ist (wenn es sogar die Möglichkeit bietet, den Namen zu konfigurieren).

Michael Burr
quelle
7
Danke Michael, in meinem Fall wurde lib nicht generiert, weil es keine Exporte gab.
Uday
4
OK, was bedeutet das? Ich habe die Importbibliothek in meinem DLL-Projekt angegeben und die DLL wurde immer noch nicht erstellt. Ich habe es in das Projekt eingefügt, das meine DLL verwendet, und es hat auch nicht dazu geführt, dass es erstellt wurde. Ich verwende Visual C ++ 2010 Express
Thom
3
Könnten Sie das etwas näher erläutern? Die Angabe der Importbibliothek allein scheint die LIB-Datei nicht zu generieren.
Will Tice
11
@ Will: Haben Sie Funktionen, die mit dem __declspec(dllexport)Attribut markiert sind ?
Michael Burr
4
Achtung für Anfänger: Eine Importbibliothek ist keine statische Bibliothek, auch wenn beide .lib sind. Weitere Infos zu dieser Antwort .
KrisWebDev
38

OK, also fand ich die Antwort von http://binglongx.wordpress.com/2009/01/26/visual-c-does-not-generate-lib-file-for-a-dll-project/ , dass dieses Problem besagt wurde dadurch verursacht, dass keine Symbole exportiert wurden und weitere Anweisungen zum Exportieren von Symbolen zum Erstellen der lib-Datei gegeben wurden. Fügen Sie dazu der .h-Datei für Ihre DLL den folgenden Code hinzu.

#ifdef BARNABY_EXPORTS
#define BARNABY_API __declspec(dllexport)
#else
#define BARNABY_API __declspec(dllimport)
#endif

Wobei BARNABY_EXPORTS und BARNABY_API eindeutige Definitionen für Ihr Projekt sind. Dann geht jeder Funktion, die Sie exportieren, einfach Folgendes voraus:

BARNABY_API int add(){
}

Dieses Problem hätte entweder durch Klicken auf das Feld Symbole exportieren im DLL-Assistenten für neue Projekte oder durch Ja-Stimmen für Lobotomien für Computerprogrammierer verhindert werden können.

Thom
quelle
Können Sie dies so bearbeiten, dass es keine exakte Kopie Ihrer anderen Antwort ist? Es ist ein guter Ausgangspunkt, es auf diese Frage anzuwenden. Vielen Dank.
Behoben, Will. Ich habe diese Antwort versehentlich auf diese Seite gepostet. Ich habe jetzt mein Chaos aufgeräumt. Danke, dass du mich überwacht hast.
Thom
2
Toter Link ab September 2017
ToastyMallows
@ToastyMallows Deshalb habe ich meine Antwort für den Fall, dass der Link weg ist, ausführlich erklärt.
Thom
9

Sie sollten hier auch den Def-Namen in den Projekteinstellungen angeben:

Konfiguration> Eigenschaften / Eingabe / Erweitert / Modul> Definitionsdatei

Chris Long Gue
quelle
6
Befindet sich am Configuration Properties/ Linker/ Input/ Module Definition Filein VS2010
Pakman
Wie erstellt man die Definitionsdatei? Was geht hinein?
Thomas Matthews
Danke ... das hat mich die Wand hochgetrieben.
Richard Anthony Hein
2
@ThomasMatthews Es ist ein Dateityp, wenn Sie zu Neues Element hinzufügen - Code - Moduldefinitionsdatei (.def) gehen. Vermutlich wird die Definitionsdatei zur Einstellung in der Antwort hier hinzugefügt, wenn sie über VS hinzugefügt wird. In meinem Fall existierte die .def bereits.
Richard Anthony Hein
@RichardHein: Eine Moduldefinitionsdatei (.Def) "liefert dem Linker Informationen zu Exporten, Attributen und anderen Informationen über das zu verknüpfende Programm. " Unter anderem können Sie Exporte aus einer DLL angeben (siehe Exportieren aus einer DLL mit DEF-Dateien für Details).
Unsichtbarer