2012-06-15 19 views
10

Są rzeczy, których nie rozumiem, jeśli chodzi o łączenie ... Piszę program za pomocą biblioteki 3rd party (biblioteka GEOS). Ten program ma zależność od geos.lib, ale nadal wymaga uruchomienia geos.dll.Program statycznie połączony z biblioteką, ale nadal potrzebuje biblioteki dll do uruchomienia

Czytam this question, myślę, że rozumiem różnicę między bibliotekami statycznymi i dynamicznymi. Czego nie rozumiem, to dlaczego wciąż potrzebuję biblioteki dll, gdy statycznie łączę bibliotekę.

Odpowiedz

16

To nie jest statycznie połączone. Plik .lib jest po prostu biblioteką pośredniczącą, która wiąże się w .dll w oknach. Oznacza to, że łączysz się z .lib w czasie kompilacji, a następnie w czasie wykonywania będzie szukać pliku .dll.

+0

Nie ma żadnych opcji pozwalających na statyczne połączenie kodu z określonego pliku .dll? –

+1

Myślę, że musisz skompilować bibliotekę do statycznego linkowania, nie jestem pewien, czy możesz zmienić bibliotekę dll w statycznie połączoną bibliotekę po jej skompilowaniu. –

+0

@Andrew So pliki dll zawsze pochodzą z .lib? Skąd mam wiedzieć, kiedy plik .lib nie jest wystarczający i muszę dostarczyć bibliotekę DLL? – undu

0

Zdecydowanie łączysz się z biblioteką dynamiczną. Tylko dlatego, że linker wymaga pliku .lib nie oznacza, że ​​łączysz się z biblioteką statyczną.

0

Możesz statycznie połączyć plik lib wtedy i tylko wtedy, gdy jest to statyczny plik lib. Najpierw musisz przekonwertować projekt biblioteki DLL na statyczną bibliotekę lib, skompilować go, a następnie użyć produktu z twojej kompilacji, który będzie statycznym plikiem .lib.

18

Istnieją 3 rodzaje bibliotek w systemie Windows:

  • obiekt biblioteki (* lib)
  • import biblioteki (* lib)
  • dynamiczne biblioteki (* .dll)

biblioteki obiektów są statycznie połączone. Zawierają one pełne definicje obiektów kodu pobieranego przez bibliotekę.

Biblioteki importu to specjalna forma biblioteki obiektów. Zamiast zawierać kod zawierają informacje dla linkera, który ostatecznie mapuje plik wykonywalny do biblioteki dołączanej dynamicznie.

biblioteki dołączane dynamicznie, takie jak biblioteki obiektów, kod źródłowy programu. Jednak ten kod jest ładowany w środowisku wykonawczym i nie jest wkompilowany w plik exe.

Nie zawsze trzeba łączyć bibliotekę importu. Zamiast tego możesz wywołać funkcję LoadLibrary() i wyszukać punkty wejścia API według nazwy lub liczby porządkowej. (Zawsze musisz podać kod, który DLL i gdzie w tym DLL API, które chcesz wprowadzić.)

Inne komentarze tutaj są poprawne, ponieważ nie można zrobić DLL do statycznej biblioteki bez rekompilacji kodu dla biblioteki - to inny rodzaj produkcji.

+4

[Przewodnik dla początkujących dla łączników] (http://www.lurklurk.org/linkers /linkers.html) to świetny artykuł o łączeniu. Znalazłem to w tym tygodniu podczas badania dokładnie tego samego pytania. – Pressacco

1

Jeśli .lib został stworzony przez Visual Studio, to sprawdź wartość właściwości projektu -> Linker -> Wejście -> Plik definicji modułu. Jeśli nie jest pusta, wówczas link.exe utworzy bibliotekę zastępczą zamiast biblioteki statycznej, nawet jeśli Właściwości projektu -> Ogólne -> Typ konfiguracji to "Biblioteka statyczna (.lib)".