2013-03-09 10 views
7

Próbuję uruchomić projekt silnika gry C++.Nie można odwoływać się do projektu biblioteki (DLL), ponieważ brakuje pliku .lib

Nie mam dużo wiedzy o bibliotekach DLL i bibliotekach lib, ale zorientowałem się, że sam silnik będzie biblioteką dll i będę mieć oddzielne projekty dll, takie jak renderer, dane wejściowe, itp., Które byłyby używane przez silnik, a dll silnika byłby być używane przez grę.

Wygląda na to, że projekt silnika odniesiony jest dobrze w projekcie demo.exe (przez dodanie odniesienia i dodanie ścieżki do dodatkowych katalogów), ale podczas próby dodania odwołania do projektu renderującego dll w projekcie dll silnika dostaję:

błąd LNK1104: nie można otworzyć pliku 'mojasciezka \ Renderer.lib' mojasciezka \ LINK Silnik

Dlaczego przywołujące bibliotekami?

+0

możliwe duplikat [Jak zrobić plik .lib gdy masz plik .dll i plik header] (http://stackoverflow.com/questions/9360280/how-to-make-a-lib -file-when-have-a-dll-file-and-a-header-file) – jww

Odpowiedz

2

Generalnie

Biblioteka może dać To API w dwóch trybach:

  • dynamiczna: mniejszy plik wykonywalny, ale potrzebuje jego DLL.

  • Statyczny: Większy plik wykonywalny, ale autonomiczny.

Przede wszystkim zdecydować, jak chcesz korzystać z tej biblioteki, statycznie lub dynamicznie ?! Następnie skonfiguruj swój projekt, aby kompilator mógł znaleźć pliki nagłówkowe tej biblioteki. Następnie, jeśli jest to konieczne, dodaj pliki LIB do projektu.

W Twoim przypadku: Sprawdź, czy pliki LIB zostały poprawnie dodane do projektu lub pliku Makefile, czy nie?

+0

Cieszę się, że robię to dynamicznie, w ten sposób, jeśli kiedykolwiek wyślę grę, która zostanie wysłana z odpowiednią biblioteką dll, co oznacza, że ​​jest łatwiejsza aktualizować i modyfikować, jeśli to konieczne. W takim przypadku mój projekt Renderer dll nie tworzy pliku lib, tylko plik DLL, ilk i pdb. Zauważyłem, że podczas wyszukiwania w ramach właściwości referencyjnych projektu mojego renderera (na karcie właściwości i odnośników we właściwościach silnika) jest dostępna opcja true dla zależności biblioteki łącza. Wydaje się, że kompilacja jest ustawiona na false, ale czy to dużo znaczy? – EvilWeebl

2

projekt silnika odwołuje porządku w projekcie demo.exe (poprzez dodanie odniesienia i dodanie ścieżki do katalogów zawierać dodatkowy)

niektórych bibliotekach można powiązać statycznie, co oznacza, że ​​trzeba tylko pliki nagłówkowe (.h/.hpp) i .lib plików. Inne biblioteki mogą wymagać dynamicznego powiązania, które spowoduje, że twój program będzie zależał od niektórych plików DLL, ale zazwyczaj będziesz musiał mieć pliki nagłówkowe, aby wiedzieć, co jest w tych bibliotekach DLL. Czasami, co wydaje się być twoim przypadkiem, potrzebujesz ich wszystkich: plików nagłówkowych, bibliotek statycznych i bibliotek DLL.

Pliki nagłówkowe zawierają deklaracje, określają strukturę swoich klas, deklarują prototypy swoich funkcji itp statyczne biblioteki (.lib pliki) jest binariów, które zawierają definicje swoich funkcji, zmiennych i tak dalej , które muszą zostać rozwiązane podczas kompilacji, więc gdy ich nie będzie, linker będzie narzekał. Dynamicznie powiązane biblioteki (DLL) również są plikami binarnymi, ale są one rozwiązywane w czasie wykonywania, co oznacza, że ​​czas, kiedy naprawdę ich potrzebujesz, jest po uruchomieniu programu.

9

Wiele bibliotek DLL zawiera odpowiednie biblioteki LIB, które są potrzebne tylko na etapie łączenia.Więc w zasadzie są 2 rodzaje bibliotek LIB:

  1. rzeczywistym biblioteka statyczna, który zawiera wszystkie pliki obiektowe

  2. Bibliotekę tylko z definicji dla linkera, tego rodzaju bibliotek pochodzi z DLL

Po prostu musisz połączyć ten plik LIB, aby móc pracować z DLL

+1

Nie mogę znaleźć żadnych plików .lib tworzonych w dowolnym miejscu. Jeśli biorę na przykład projektu DLL renderer, który chcę włączyć do mojego projektu dll silnika. Renderuje dobrze i wyprowadza pliki * .dll, * .ilk i * .pdb do mojego folderu (solution)/Debug. Istnieją również pliki w moim folderze (solution)/Renderer/Debug, takim jak * .obj. Gdzie powinienem się łączyć? Również kiedy w końcu dojdzie do projektu instalacji, czy po prostu potrzebuję również biblioteki DLL lub łączników? – EvilWeebl

+0

W moim przypadku folder zawierający pliki * .obj zawiera również * .lib, ale inne projekty nie mogą go tam znaleźć ... –

3

Więc posortowałem mój problem. Ponieważ były to nowe projekty, nie zostały jeszcze zaimplementowane żadne metody, więc nie tworzono żadnej biblioteki, więc nie ma nic, co mogłoby się odnosić do mnie.

Jedną ostatnią rzeczą jest problem z definicją makra dllimport/dllexport dla pliku nagłówkowego. Próbuję uzyskać to, aby zdefiniować dllexport, gdy jest to eksportowany projekt, ale powiedzmy, że mój projekt to 2 nazwy, np. "Niesamowity silnik", a następnie, w jaki sposób uzyskać makro eksportu, które najwyraźniej jest tworzone automatycznie? Czy powinienem używać podkreślenia dla przestrzeni?

#ifdef AWESOME_ENGINE_EXPORTS // Or AWESOMEENGINE_EXPORTS? 
#define DLL __declspec(dllexport) 
#else 
#define DLL __declspec(dllimport) 
#endif 
+0

Kliknij prawym przyciskiem myszy projekt, właściwości, właściwości konfiguracji, C/C++, preprocesor . Dodaj 'AWESOME_ENGINE_EXPORTS' (lub dowolną dowolną opcję) do listy Preprocessor Defines twojej biblioteki DLL. To sprawia, że ​​makro jest zdefiniowane w bibliotece dll, powodując eksport funkcji. Wszyscy inni nie będą mieli tego makra, więc funkcje zostaną zaimportowane. –

Powiązane problemy