C++: różnica między linkowaniem biblioteki a dodawaniem katalogów include

Prawie tytuł to podsumowuje.

Nie jestem pewien, jaka jest różnica między tymi dwoma, jeśli chciałbym korzystać z biblioteki.

Dzięki!

Author: Setheron, 2011-08-17

3 answers

Ogólnie rzecz biorąc, potrzebujesz obu.

Pliki Include zawierają deklaracje typów, prototypów funkcji, inline funkcji, #defines, ..., generalnie każda informacja o bibliotece, o której kompilator musi być świadoma podczas kompilacji plików.

Biblioteki statyczne zamiast tego zawierają rzeczywisty kod obiektowy funkcji biblioteki. Jeśli nagłówki zawierają prototypy, biblioteki statyczne zawierają (skompilowane) definicje z funkcje, czyli Moduły obiektowe, które linker połączy z Twoim.

Jeśli dodałbyś tylko plik nagłówkowy bez linkowania do biblioteki statycznej, linker skarżyłby się na brakujące definicje, ponieważ używałbyś funkcji zadeklarowanych w nagłówku, ale nie zdefiniowanych gdziekolwiek (=bez implementacji). Z drugiej strony, jeśli tylko połączysz statyczną bibliotekę bez podania nagłówka, kompilator będzie narzekał na Nieznany identyfikatorów, ponieważ nie ma pojęcia o symbolach biblioteki, których używasz.

Koncepcja jest bardzo podobna do kompilacji projektu z wieloma plikami: aby uzyskać dostęp do definicji napisanych w innych .cpp, musisz dołączyć tylko nagłówek z ich deklaracjami, a linker na końcu łączy ze sobą różne moduły obiektowe.

Jeśli chodzi o biblioteki DLL, zwykle dostarczana jest biblioteka importu; biblioteki importu są jak biblioteki statyczne, ale zamiast zawierające cały kod biblioteki, zawierają małe stuby, które wywołują funkcje do biblioteki dll. Za każdym razem, gdy w jednym z modułów obiektu zostanie napotkane wywołanie funkcji bibliotecznej, linker kieruje ją do elementu początkowego, który z kolei przekierowuje ją do kodu do biblioteki dll1. Podsumowując, gdy masz do czynienia z bibliotekami DLL w systemie Windows, Zwykle masz .h (prototypy/...), a .lib (Importuj bibliotekę, z którą się łączysz, zawiera stuby) oraz a .dll (dynamic-linking library zawierający rzeczywisty kod biblioteki).

Przy okazji, niektóre biblioteki są "tylko nagłówkowe" (wiele można znaleźć w boost), co oznacza, że cały ich kod jest umieszczany w nagłówku, więc nie jest potrzebna statyczna biblioteka. Takie biblioteki często składają się tylko z kodu wbudowanego (functions/classes/...) i szablonów, dla których nie jest potrzebna oddzielna definicja.

Często dzieje się tak, ponieważ biblioteki statyczne są brzydkimi bestiami z kilku powodów:

  • musisz jednoznacznie linkować przeciwko them;
  • ponieważ są one bezpośrednio powiązane z Twoim kodem, muszą używać dokładnie tej samej biblioteki uruchomieniowej C / C++, co oznacza, że przynajmniej w Windows Dystrybucja bibliotek statycznych jest niepraktyczna (różne Kompilatory, różne wersje kompilatorów, różne konfiguracje tego samego kompilatora używają różnych bibliotek standardowych, Dystrybucja statycznej biblioteki dla każdej kombinacji tych aspektów byłaby co najmniej niepraktyczna); {[40]]}
  • Z tego powodu, w ogóle trzeba najpierw skompiluj na własnej wersji biblioteki statycznej, a następnie połącz się z nią.

Porównaj to wszystko z dołączeniem pliku nagłówkowego... :)


  1. w rzeczywistości nowoczesne łańcuchy narzędzi rozpoznają te znaczniki i unikają dodatkowego kroku indirection. Zobacz ten serial autorstwa Raymonda Chena po szczegóły.
 44
Author: Matteo Italia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-15 11:39:49

Kompilator musi znać katalogi include, ponieważ musi zawierać pliki nagłówków ( interface) bibliotek, których chcesz użyć.

Linker musi znać katalogi bibliotek, ponieważ musi połączyć Twój plik wykonywalny z (wstępnie skompilowaną) implementacją biblioteki.

Zobacz także jakie są różnice między kompilatorem a linkerem?

 22
Author: Ferdinand Beyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:55

Katalogi Include są przeznaczone tylko dla plików nagłówkowych, które zazwyczaj zawierają tylko sygnatury funkcji/metod. Musisz połączyć się z biblioteką, aby mieć dostęp do jej rzeczywistego kodu obiektowego.

Zobacz to pytanie .

 3
Author: Pedro Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:46