2012-11-01 4 views
6

So habe ich eine C++ - Lösung, die 3 Projekt (2 DLL und 1 .exe) enthält.DLL-Projekt generiert nicht .exp und .lib-Datei

hier die grundlegenden Abhängigkeiten Darstellung:

Applikation -> DLL2

Applikation -> DLL1

DLL2 -> DLL1

Das Problem, das ich habe ist, dass DLL2 (wenn Wenn Sie es erstellen, generiert es die .dll, generiert aber nicht die .lib und .exp, die ich im Anwendungsprojekt richtig DLL2 referenzieren muss. DLL1 erzeugt diese Dateien jedoch und ich habe DLL1-Einstellungen mit DLL2 verglichen, und ich kann nicht finden, was der Unterschied sein könnte.

Antwort

4

Das Problem bestand darin, dass DLL2 nur H-Dateien und keinen Inhalt in einer der zugeordneten CPP-Dateien hatte. Daher sah die IDE nicht die Notwendigkeit, die .lib-Datei zu erstellen.

+0

danke diese Antwort hat mir geholfen. Außerdem muss ich mindestens eine 'static __declspec (dllexport)' Methode hinzufügen, um 'lib' Datei erscheinen zu lassen – javapowered

9

Die einfache Erklärung dafür ist, dass Sie einfach vergessen haben, etwas zu exportieren. Der Linker erstellt keine .lib/.exp-Datei, wenn keine Exporte vorhanden sind. Sie können dies überprüfen, indem Sie in der DLL dumpbin.exe /exports ausführen. Mit der Erwartung, dass du nichts siehst.

Verwenden Sie __declspec(dllexport), um Symbole aus der DLL zu exportieren. Oder eine .def-Datei.

+0

Und denken Sie daran, die Header aufzunehmen, die das übliche Exportmakro definieren. :) –

0

Ich habe gerade einen anderen Weg entdeckt, um das Gleiche zu bewirken. Ich habe einige Routinen, die ich als Service-Routinen in einer anderen DLL entwickelt und getestet habe, in eine eigene DLL verschoben. Da diese Verschiebung geplant war, bevor ich die erste Codezeile geschrieben habe, wurden sie nicht für den Export markiert und verwendeten daher die standardmäßige Aufrufkonvention des Projekts, __cdecl. Beim Erstellen der Bibliothek hat die Build-Umgebung keine LIB-Datei erstellt. Nach einigen Nachforschungen und inspiriert von der Erwähnung von __declspec (dllimport) in diesem Thema, erkannte ich, dass, obwohl ich die Deklarationen in die Template-Header-Datei vom New Project Wizard verschoben habe, vergessen habe, den Namen der generierten Aufrufkonvention einzufügen Makro in die Prototypen.

Mit der Aufrufkonvention angegeben, sowohl in der Kopfzeile und die CPP-Dateien, die die Implementierungen enthalten, habe ich die erwartete .LIB-Datei.