2012-11-01 11 views
6

Mam więc rozwiązanie C++, które zawiera 3 projekty (2 DLL i 1 .exe).Projekt DLL nie generuje plików .exp i .lib

oto podstawowa reprezentacja zależności:

Application -> DLL2

Application -> DLL1

DLL2 -> DLL1

Problem mam to, że DLL2 (gdy budowanie go) generuje plik .dll, ale nie generuje plików .lib i .exp. Muszę poprawnie odwoływać się do DLL2 w projekcie aplikacji. Jednak DLL1 generuje te pliki, a ja porównałem ustawienia DLL1 z bibliotekami DLL2 i nie mogę znaleźć różnicy.

Odpowiedz

4

Problem polegał na tym, że DLL2 zawierało tylko pliki .h i brak zawartości w żadnym z powiązanych plików .cpp. Tak więc IDE nie widział konieczności tworzenia pliku .lib.

+0

dzięki tej odpowiedzi pomógł mi. również muszę dodać co najmniej jedną metodę 'static __declspec (dllexport)', aby plik 'lib' pojawił się – javapowered

9

Prostym wytłumaczeniem jest to, że po prostu zapomniałeś wyeksportować czegokolwiek. Łącznik nie utworzy pliku .lib/.exp, jeśli nie ma eksportu. Można to sprawdzić, uruchamiając dumpbin.exe /exports w bibliotece DLL. Z oczekiwaniem, że nic nie zobaczysz.

Aby eksportować symbole z biblioteki DLL, należy użyć __declspec(dllexport). Lub plik .def.

+0

Pamiętaj, aby uwzględnić nagłówki, które definiują zwykłe makro eksportu. :) –

0

Właśnie odkryłem inny sposób wywołania tego samego. Przeniosłem niektóre procedury, które opracowałem i przetestowałem jako procedury obsługi w innej bibliotece DLL do własnej biblioteki DLL. Ponieważ ten ruch został zaplanowany, zanim napisałem pierwszą linię kodu, nie zostały one oznaczone do eksportu i dlatego używały domyślnej konwencji wywoływania tego projektu __cdecl. Po zbudowaniu biblioteki środowisko kompilacji nie utworzyło pliku .LIB. Po pewnym badaniu i zainspirowaniu przez wzmiankę o __declspec (dllimport) w tym temacie, zdałem sobie sprawę, że mimo że przeniosłem deklaracje do pliku nagłówkowego szablonu wygenerowanego przez Kreatora nowego projektu, zapomniałem wstawić nazwę wygenerowanej konwencji wywoływania makro do prototypów.

Z określoną konwencją wywołania, zarówno w pliku nagłówkowym, jak i CPP przechowującym implementacje, uzyskałem oczekiwany plik .LIB.

Powiązane problemy