2009-02-24 3 views
55

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 dafür sorgt, dass diese DLL-Datei in andere Projekte geladen wird, die sie verwenden).Wie erstelle ich eine Importbibliothek (.lib) UND eine DLL in Visual C++?

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

Aber 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, weil on the MSDN it says "The linker creates the import library when the DLL is built." auch another user of this website is creating LIB and DLL files at the same time using Visual C++.

Also wie kann ich es tun?

+1

Ich hatte gerade dieses genaue Problem, wo meine .lib-Datei nicht generiert wurde. Nachdem ich alle Informationen durchforstet hatte, die ich über mögliche Ursachen finden konnte und sorgfältig alle Antworten durchging, fand ich heraus, dass dies daran lag, dass meine .cpp-Datei meine .h-Datei nicht enthielt. :(Wirf es hier raus, damit mein Kommentar (mit einer kleinen Wahrscheinlichkeit) jemandem/mir helfen kann, wenn sich mein dummer Fehler in einer fernen Zukunft wiederholt ... – user1884905

Antwort

19

Durch Auswahl von 'Klassenbibliothek' haben Sie versehentlich eine .Net-Bibliothek mit der erweiterten CLI-Erweiterung von C++ erstellt.

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

Sie können auch eine MFC-DLL oder ATL-DLL aus dieser Bibliothek auswählen, wenn Sie diese Route gehen möchten, aber es klingt wie Sie nicht.

68

Hat Ihr DLL-Projekt tatsächliche Exporte? Wenn keine Exporte vorhanden sind, generiert der Linker keine .LIB-Datei für die Importbibliothek.

In der Nicht-Express-Version von VS ist der Import libray Name hier in den Projekteinstellungen specfied:

Configuration Properties/Linker/Advanced/Import Library 

Ich nehme an, es das gleiche in Express ist (wenn es bietet sogar die Möglichkeit, den Namen zu konfigurieren).

+6

Danke Michael, in meinem Fall wurde lib nicht erzeugt, weil es keine Exporte gab. – Uday

+4

OK, was bedeutet das? Ich habe die Import-Bibliothek auf meinem DLL-Projekt angegeben und es erstellt immer noch nicht die DLL. Ich habe es in das Projekt eingefügt, das meine DLL verwendet, und es hat auch nicht dazu geführt, dass es gebaut wurde. Ich benutze Visual C++ 2010 Express – Thom

+1

Könnten Sie ein wenig zu diesem Thema klären? Das Angeben der Importbibliothek allein scheint die LIB-Datei nicht zu generieren. –

8

Sie sollten auch angeben, def in den Projekteinstellungen nennen hier:

Konfiguration> Eigenschaften/Input/Advanced/Module> Definition File

+4

Befindet sich unter 'Konfigurationseigenschaften' /' Linker'/'Eingabe' /' Moduldefinitionsdatei' in VS2010 – Pakman

+0

Wie erstellt man die Definitionsdatei? Was geht hinein? –

+0

Danke ... das hat mich an die Wand gefahren. –

23

OK, so fand ich die Antwort von http://binglongx.wordpress.com/2009/01/26/visual-c-does-not-generate-lib-file-for-a-dll-project/ sagt, dass dieses Problem war Dies wird dadurch verursacht, dass keine Symbole exportiert werden, und gibt Anweisungen zum Exportieren von Symbolen zum Erstellen der lib-Datei. Fügen Sie dazu den folgenden Code zu Ihrer .h-Datei für Ihre DLL hinzu.

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

Wo BARNABY_EXPORTS und BARNABY_API eindeutige Definitionen für Ihr Projekt sind. Dann wird jede Funktion, die Sie Sie einfach exportieren voraus von:

BARNABY_API int add(){ 
} 

Dieses Problem verhindert entweder durch Anklicken des Symbols Export-Box auf dem neuen Projekt DLL-Assistenten oder durch Abstimmung ja für Lobotomien für Computer-Programmierer haben könnte.

+0

Können Sie das bearbeiten, so dass es keine exakte Kopie Ihrer anderen Antwort ist? Die Anwendung auf diese Frage ist ein guter Ausgangspunkt. Vielen Dank. – Will

+0

Fest, Will. Ich habe diese Antwort versehentlich auf diese Seite gepostet. Ich habe jetzt mein Durcheinander aufgeräumt. Danke, dass du mich beobachtet hast. – Thom

+4

+1 für die "Lobotomien für Computerprogrammierer." –