Jaka jest różnica między plikiem nagłówkowym a biblioteką?

80

Jedną z rzeczy, które trudno mi zrozumieć, jest sposób działania kompilatora. Mam z tym wiele problemów, ale w szczególności ciągle mijają się nagłówki i biblioteki. Byłoby świetnie, gdyby ktoś mógł trochę wyjaśnić.

Xonara
źródło
1
C i C ++ to różne języki programowania. I obie są specyfikacjami - nie są oprogramowaniem! - napisane (głównie w języku angielskim) w jakimś standardzie, jak n1570 dla C i n3337 dla C ++
Basile Starynkevitch

Odpowiedzi:

126

Pomyśl o obu w ten sposób (Uwaga: jest to analogia na wysokim poziomie;).

  • Nagłówek jest numer telefonu można zadzwonić, a ...
  • ... biblioteka to osoba, do której możesz dotrzeć!

To podstawowa różnica między „interfejsem” a „implementacją”; interfejs (nagłówek) mówi, jak zadzwonić niektóre funkcje (nie wiedząc, jak to działa), natomiast realizacja (biblioteka) jest rzeczywista funkcjonalność.

Uwaga: Koncepcja jest tak fundamentalna, ponieważ zapewnia elastyczność: możesz mieć ten sam nagłówek dla różnych bibliotek (tj. Funkcjonalność jest wywoływana dokładnie w ten sam sposób), a każda biblioteka może implementować funkcjonalność w inny sposób. Utrzymując ten sam interfejs, można zastąpić bibliotek nie zmieniając swój kod.

Oraz: możesz zmienić implementację biblioteki bez łamania kodu wywołującego!

wołowiny2k
źródło
2
Ech ... Nadal czegoś tu nie rozumiem. Po pierwsze, nie jestem nawet do końca pewien, jak powstają biblioteki, wszystkie programy, które skompilowałem, nie wydają się ich potrzebować - po prostu nie są generowane. Zakładam, że biblioteki trzeba zdefiniować? Ale ignorując to, gdzie w grę wchodzą główne pliki źródłowe? Myślałem, że nagłówki są przeznaczone do implementacji, a główne pliki źródłowe dla interfejsu - biblioteki są potrzebne tylko do kompilacji pliku wykonywalnego ... W każdym razie jeśli są statyczne.
Xonara
2
Biblioteki są ZAPROGRAMOWANE: Możesz napisać program lub napisać bibliotekę.
TomTom
2
Jeśli dostałem bibliotekę od innych. Przykład Util.libJak wywołać jej funkcję? Czy muszę dołączyć jego pliki nagłówkowe również istotne dla U til.lib?
Elshan
Jeśli chodzi o nagłówek , zrozumiałem, ale jeśli chodzi o implementację, nadal jestem zdezorientowany. Ponieważ, ogólnie rzecz biorąc, pliki źródłowe zawierają prawo implementacji? Jeśli mamy już pliki źródłowe, to po co w ogóle potrzebujemy biblioteki ? Z góry bardzo dziękuję!
Mediolan
57

Plik nagłówkowy to zwykle używany do definiowania interfejsu lub zestawu interfejsów w aplikacji. Potraktuj plik nagłówkowy jako coś, co pokazuje zewnętrzną funkcjonalność programu, pomijając techniczne szczegóły implementacji.

Na przykład, jeśli optymalizowałeś program, najprawdopodobniej zmodyfikowałbyś plik źródłowy (.cpp), aby ulepszyć algorytm, ale plik nagłówkowy nie zmieniłby się, ponieważ klienci zewnętrzni nadal wywołują metody przy użyciu tego samego zestawu parametrów i zwracane wartości.

W języku zorientowanym obiektowo, takim jak C ++, plik nagłówkowy zazwyczaj zawiera następujące elementy:

  • Opis klasy i hierarchia dziedziczenia
  • Klasy składowe i typy danych
  • Metody klasowe

Chociaż nic nie stoi na przeszkodzie, aby kod został zaimplementowany w pliku nagłówkowym, generalnie nie jest to preferowane, ponieważ może wprowadzić dodatkowe sprzężenie i zależności w kodzie.

W niektórych przypadkach (np. Klas opartych na szablonach) implementacja musi być zdefiniowana w pliku nagłówkowym ze względów technicznych.


Biblioteka jest zbiorem kodu, który chcesz udostępnić programu lub grupy programów. Obejmuje implementację określonego interfejsu lub zestawu interfejsów.

Kod jest zdefiniowany w bibliotece, aby zapobiec powielaniu kodu i zachęcać do ponownego wykorzystania. Biblioteka może być połączona statycznie (.lib) lub dynamicznie (.dll):

  • Statycznie połączone biblioteka zawiera zbiór symboli eksportu (które mogą być traktowane jako definicji sposobu), które są następnie połączone do końcowego wykonywalnego (.exe) w wiążącym etapie budowy. Ma tę zaletę, że skraca czas wykonywania (ponieważ biblioteka nie musi być ładowana dynamicznie) kosztem większego pliku binarnego (ponieważ metody są zasadniczo replikowane w pliku wykonywalnym).

  • Dynamicznie powiązane biblioteka jest powiązana w trakcie realizacji programu, a nie powiązania programu. Jest to przydatne, gdy wiele programów musi ponownie używać tych samych metod i jest szeroko stosowane w technologiach takich jak COM.

LeopardSkinPillBoxHat
źródło
10

Jedną rzeczą, która może być myląca, jest to, że biblioteka słów może mieć kilka znaczeń w C ++. Jedno znaczenie zostało tutaj dobrze omówione:

Zestaw funkcji, które można połączyć w pliku binarnym. Mogą być połączone statycznie lub dynamicznie.

Ale jest inny typ biblioteki: tak zwane biblioteki tylko nagłówkowe (w tym części STL, TR1 i Boost). Te nie istnieją w oddzielnej formie binarnej, więc biblioteka słów nie odnosi się do konkretnego pliku binarnego, ale raczej do zestawu dołączonych plików nagłówkowych.

Mam nadzieję że to pomoże.

jwfearn
źródło
8

Biblioteka to kod, skompilowany w zestawie plików obiektowych. Pliki obiektowe zawierają skompilowany kod maszynowy i deklaracje danych używane przez kod.

Plik nagłówkowy definiuje interfejs do biblioteki: informuje, jak poprawnie używać biblioteki. W C / C ++ plik nagłówkowy zawiera listę nazw funkcji i sposób wywoływania tych funkcji: liczbę i typy przyjmowanych przez nie parametrów, typ zwracania, konwencję wywoływania itp. Pliki nagłówkowe zawierają wiele innych rzeczy je też, ale ostatecznie sprowadza się to do zestawu reguł wywoływania kodu biblioteki.

Adam Rosenfield
źródło
8

Nagłówek zawiera tylko deklarację, podczas gdy biblioteki zawierają również implementację.

Moayad Mardini
źródło
2

Jeśli Biblioteka w językach programowania jest biblioteką ogólną, to wiele książek obecnych w bibliotece można porównać z funkcjami / metodami w językach. A także pliki nagłówkowe można porównać z numerem wiersza książki Przypuśćmy, że w jakiejś bibliotece w Hyderabad jest książka iw tej bibliotece ta książka jest obecna w wierszu numer 24 ... Tak samo, jak podano adres biblioteki używając przestrzeni nazw std (dla biblioteki standardowej) i wiersz nr jest podawany przez plik nagłówkowy, w którym umieszczane są wszystkie książki (w tym przypadku metody) o tym samym czasie (wszystkie metody związane ze strumieniami wejścia / wyjścia)

user2131930
źródło
2

Nagłówek jest zwykle używany do przechowywania prototypów. Nagłówki rozwijają się w czasie wstępnego przetwarzania, więc w czasie kompilacji kod może mieć dostęp do odpowiednich deklaracji / prototypów funkcji.

Biblioteka jest rzeczywistym oprogramowaniem, które zawiera definicje prototypów funkcji (obecnych w nagłówku). Biblioteka jest używana w czasie łączenia. Definicje (obecne w bibliotece) są rozwiązywane w czasie łączenia.

Syed.Waris
źródło
1

Plik nagłówkowy opisuje, jak wywołać tę funkcję , biblioteka zawiera skompilowany kod, który implementuje tę funkcję.

ostry
źródło
1

PLIK NAGŁÓWKOWY to taki, w którym zapisywana jest deklaracja funkcji, a używając pliku nagłówkowego możemy uzyskać dostęp do określonej funkcji

podczas

PLIK LIBRARY to plik, w którym zapisana jest definicja określonej funkcji. MATH.H jest plikiem nagłówkowym, podczas gdy MATH.LIB jest plikiem bibliotecznym.

vipin
źródło
1

Praca z plikiem HEADER i LIBRARY w programie.

Plik nagłówkowy zawiera łącza do bibliotek (biblioteki zawierają standardowe funkcje i metody), kompilator rozpoznaje standardowe funkcje użyte w kodzie źródłowym poprzez preprocesor, który rozwiązuje wszystkie dyrektywy (dyrektywy to linie w programie poprzedzone znakiem #, które zawierają ) przed właściwą kompilacją programu.

Dziękuje za przeczytanie!

Paulo Roberto
źródło
1

Myślę, że biblioteka jest pakietem kodu, który jest wielokrotnie używany i ten kod jest prekompilowany, dlatego jest dostępny w standardowej formie, dzięki czemu nie musimy pisać tego kodu dla każdego programu, który tworzymy. Plik nagłówkowy zawiera odniesienie do tego kodu w prosty sposób, funkcje, których używamy w naszym programie, takie jak "cin" i "cout", są w pełni zdefiniowane w standardowej bibliotece, a pliki nagłówkowe, takie jak plik nagłówkowy iostream, zawierają odniesienie do tego kodu. Kiedy więc kompilujemy nasz kod, otrzymujemy po prostu prekompilowany kod dla cin i cout, i nie musimy pisać kodu dla cin i cout za każdym razem, gdy go używamy. Lub w prostszy sposób możemy powiedzieć, że biblioteka zawiera kody dla wszystkich funkcji, a plik nagłówkowy jest sposobem na dotarcie do tego kodu.

shivam
źródło
1

Biblioteka to zbiór podobnych obiektów do okazjonalnego użytku. Zwykle zawiera programy w postaci kodu obiektowego lub źródłowego, szablony itp.

Plik nagłówkowy to lokalizacja (interfejs) biblioteki

Jayraj Srikriti Naidu
źródło
0

Parafrazując klasyczny żart, różnica polega na tym, że biblioteka ma plik nagłówkowy, podczas gdy plik nagłówkowy nie ma biblioteki.

Tiberiu Ana
źródło
0

Biblioteki są jak martwe mumie, owinięte białymi długimi nitkami. Oni są martwi. Jedynym sposobem na ich uwolnienie jest użycie plików nagłówkowych. Pliki nagłówkowe zawierają sposoby na ożywienie ich i można je ożywić wiele razy (ponowne wykorzystanie kodu).

jatinpunia
źródło
2
Ta analogia jest trochę ... zbyt abstrakcyjna.
byxor
0

Można rozważyć ten przykład understand- Math.hplik jest nagłówek, który zawiera prototyp dla wywołań funkcji, takich jak sqrt(), pow()etc, natomiast libm.lib, libmmd.lib, libmmd.dllto tylko niektóre z bibliotek matematycznych. Mówiąc prosto, plik nagłówkowy jest jak wizytówka, a biblioteki są jak prawdziwa osoba, więc używamy wizytówki (plik nagłówkowy), aby dotrzeć do właściwej osoby (Biblioteka).

użytkownik9121710
źródło
-4

Kod z bibliotek będzie przechowywany tylko w razie potrzeby dla pliku nagłówkowego. Cały plik nagłówkowy zostanie zapisany, co oszczędza obszar pamięci procesora.

Jerry
źródło
Witamy w StackOverflow i dziękujemy za próbę pomocy. Twoja odpowiedź może jednak zyskać na przydatności, jeśli przeformułujesz ją dla jasności i czytelności. Pomocne może być użycie przeceny do formatowania. Różnica między nagłówkami a bibliotekami ma inne, ważniejsze aspekty niż to, ile z nich jest przechowywanych.
Yunnosch