Was ist der Unterschied zwischen einer Header-Datei und einer Bibliothek?

79

Eines der Dinge, die ich nur schwer verstehen kann, ist die Funktionsweise des Compilers. Ich habe viele Schwierigkeiten damit, aber insbesondere verwechsle ich immer wieder Header und Bibliotheken. Wenn jemand die Dinge ein bisschen aufklären könnte, wäre das großartig.

Xonara
quelle
1
C und C ++ sind verschiedene Programmiersprachen. Und beide sind Spezifikationen - keine Software! - geschrieben (meistens in Englisch) in einem Standard, wie n1570 für C und n3337 für C ++
Basile Starynkevitch

Antworten:

125

Stellen Sie sich beides so vor (Haftungsausschluss: Dies ist eine wirklich hochrangige Analogie;).

  • Die Kopfzeile ist eine Telefonnummer, die Sie anrufen können, während ...
  • ... die Bibliothek ist die Person, die Sie dort erreichen können!

Es ist der grundlegende Unterschied zwischen "Schnittstelle" und "Implementierung"; Die Schnittstelle (Header) zeigt Ihnen, wie Sie einige Funktionen aufrufen (ohne zu wissen, wie sie funktionieren), während die Implementierung (Bibliothek) die eigentliche Funktionalität ist.

Hinweis: Das Konzept ist so grundlegend, weil es Ihnen Flexibilität bietet: Sie können denselben Header für verschiedene Bibliotheken verwenden (dh die Funktionalität wird genau auf dieselbe Weise aufgerufen), und jede Bibliothek kann die Funktionalität auf unterschiedliche Weise implementieren . Wenn Sie dieselbe Schnittstelle beibehalten, können Sie die Bibliotheken ersetzen, ohne Ihren Code zu ändern .

Und: Sie können die Implementierung der Bibliothek ändern, ohne den aufrufenden Code zu beschädigen!

Beef2k
quelle
2
Ehh ... ich bekomme hier immer noch nichts. Zum einen bin ich mir nicht einmal ganz sicher, wie Bibliotheken abgeleitet werden. Alle Programme, die ich kompiliert habe, scheinen sie nicht zu benötigen - sie werden einfach nicht generiert. Ich gehe davon aus, dass Bibliotheken definiert werden müssen. Aber wenn man das ignoriert, wo kommen die Hauptquelldateien ins Spiel? Ich dachte, dass Header für die Implementierung und die Hauptquelldateien für die Schnittstelle waren - Bibliotheken waren nur zum Kompilieren der ausführbaren Datei erforderlich ... Wenn sie sowieso statisch sind.
Xonara
2
Bibliotheken sind PROGRAMMIERT: Sie können ein Programm oder eine Bibliothek schreiben.
TomTom
2
Wenn ich eine Bibliothek von anderen bekommen habe. Beispiel Util.libWie nenne ich die Funktion? Muss ich die Header-Dateien einschließen, die auch für U relevant sind til.lib?
Elshan
55

Eine Header-Datei wird im Allgemeinen verwendet, um eine Schnittstelle oder einen Satz von Schnittstellen innerhalb einer Anwendung zu definieren. Stellen Sie sich eine Header-Datei als etwas vor, das die externe Funktionalität eines Programms zeigt, während die Details der technischen Implementierung weggelassen werden.

Wenn Sie beispielsweise ein Programm optimieren, würden Sie höchstwahrscheinlich die Quelldatei (.cpp) ändern, um den Algorithmus zu verbessern, aber die Header-Datei würde sich nicht ändern, da externe Clients die Methoden immer noch mit denselben Parametern und aufrufen Rückgabewerte.

In einer objektorientierten Sprache wie C ++ enthält eine Header-Datei im Allgemeinen Folgendes:

  • Klassenbeschreibung und Vererbungshierarchie
  • Klassendatenelemente und -typen
  • Klassenmethoden

Es gibt zwar nichts, was die Implementierung von Code in einer Header-Datei verhindert, dies wird jedoch im Allgemeinen nicht bevorzugt, da dies zusätzliche Kopplungen und Abhängigkeiten im Code verursachen kann.

In einigen Fällen (z. B. Vorlagenklassen) muss die Implementierung aus technischen Gründen in der Header-Datei definiert werden.


Eine Bibliothek ist eine Code-Sammlung, die Sie einem Programm oder einer Gruppe von Programmen zur Verfügung stellen möchten. Es umfasst die Implementierung einer bestimmten Schnittstelle oder eines Satzes von Schnittstellen.

Code wird in einer Bibliothek definiert, um das Duplizieren von Code zu verhindern und die Wiederverwendung zu fördern. Eine Bibliothek kann statisch verknüpft (.lib) oder dynamisch verknüpft (.dll) sein:

  • Eine statisch verknüpfte Bibliothek definiert eine Reihe von Exportsymbolen (die als Methodendefinitionen betrachtet werden können), die dann während der Verknüpfungsphase des Erstellungsprozesses mit der endgültigen ausführbaren Datei (.exe) verknüpft werden. Es hat den Vorteil einer schnelleren Ausführungszeit (da die Bibliothek nicht dynamisch geladen werden muss) auf Kosten einer größeren Binärdatei (da die Methoden im Wesentlichen in der ausführbaren Datei repliziert werden).

  • Eine dynamisch verknüpfte Bibliothek wird während der Ausführung eines Programms und nicht während der Verknüpfung eines Programms verknüpft. Dies ist nützlich, wenn mehrere Programme dieselben Methoden erneut verwenden müssen, und wird häufig in Technologien wie COM verwendet.

LeopardSkinPillBoxHat
quelle
10

Eine Sache , die Sie verwirrend sein kann , ist , dass das Wort Bibliothek mehrere Bedeutungen in C ++ haben. Eine Bedeutung wurde hier gut diskutiert:

Ein verknüpfbarer Satz von Funktionen in einer Binärdatei. Diese können statisch oder dynamisch verknüpft sein.

Es gibt jedoch einen anderen Bibliothekstyp: sogenannte Nur-Header-Bibliotheken (einschließlich Teilen von STL, TR1 und Boost). Diese existieren nicht in einer separaten binären Form so das Wort Bibliothek nicht auf eine bestimmte binäre Datei beziehen , sondern auf eine Reihe von Header - Dateien enthalten.

Hoffe das hilft.

jwfearn
quelle
8

Eine Bibliothek ist Code, der in eine Reihe von Objektdateien kompiliert wird. Die Objektdateien enthalten den kompilierten Maschinencode und die vom Code verwendeten Datendeklarationen.

Eine Header-Datei definiert die Schnittstelle zu einer Bibliothek: Sie zeigt Ihnen, wie Sie die Bibliothek richtig verwenden. In C / C ++ enthält eine Header-Datei eine Liste mit Funktionsnamen und Informationen zum Aufrufen dieser Funktionen: Anzahl und Art der verwendeten Parameter, Rückgabetyp, Aufrufkonvention usw. Header-Dateien enthalten viele andere Elemente auch sie, aber am Ende läuft es auf eine Reihe von Regeln für den Aufruf von Bibliothekscode hinaus.

Adam Rosenfield
quelle
8

Der Header enthält nur die Deklaration, während die Bibliotheken auch die Implementierung enthalten.

Moayad Mardini
quelle
2

Wenn die Bibliothek in Programmiersprachen eine allgemeine Bibliothek ist, können viele in der Bibliothek vorhandene Bücher mit Funktionen / Methoden in Sprachen verglichen werden. Außerdem können Header-Dateien mit der Zeilennummer des Buches verglichen werden. Angenommen, in einer Bibliothek in Hyderabad befindet sich ein Buch, und in dieser Bibliothek befindet sich dieses Buch in Zeile 24 ... Auf die gleiche Weise wird die Adresse der Bibliothek angegeben unter Verwendung des Namespace std (für Standardbibliothek) und Zeile Nr. wird durch die Header-Datei angegeben, in der alle Bücher (in diesem Fall Methoden) derselben Zeit (alle Methoden, die sich auf Eingabe- / Ausgabestreams beziehen) abgelegt werden

user2131930
quelle
1

Eine Header-Datei beschreibt, wie die Funktionalität aufgerufen wird. Eine Bibliothek enthält den kompilierten Code, der diese Funktionalität implementiert.

scharfer Zahn
quelle
1

HEADER FILE ist die Datei, in die die Deklaration einer Funktion geschrieben wird. Mithilfe der Header-Datei können wir auf eine bestimmte Funktion zugreifen

während

LIBRARY FILE ist die Datei, in die die Definition einer bestimmten Funktion geschrieben ist. MATH.H ist eine HEADER-DATEI, während MATH.LIB eine Bibliotheksdatei ist.

Vipin
quelle
1

Arbeiten von HEADER-Datei und BIBLIOTHEK in einem Programm.

Eine Header-Datei enthält die Links zu Bibliotheken (Bibliotheken enthalten Standardfunktionen und -methoden). Ein Compiler erkennt die im Quellcode verwendeten Standardfunktionen über einen Präprozessor, der alle Anweisungen auflöst (Anweisungen sind die Zeilen im Programm, denen ein # -Zeichen vorangestellt ist ) vor der eigentlichen Zusammenstellung des Programms.

Danke fürs Lesen!

Paulo Roberto
quelle
1

Ich denke, Bibliothek ist ein Codepaket, das viele Male wiederverwendet wird und das vorkompiliert ist. Daher ist es in Standardform verfügbar, damit wir diesen Code nicht für jedes Programm schreiben müssen, das wir entwickeln. Und die Header-Datei enthält auf einfache Weise den Verweis auf diesen Code. Die Funktionen, die wir in unserem Programm verwenden, wie "cin" und "cout", sind vollständig in einer Standardbibliothek definiert, und Header-Dateien wie die iostream-Header-Datei enthalten den Verweis auf diesen Code. Wenn wir also unseren Code kompilieren, erhalten wir nur den vorkompilierten Code für cin und cout, und wir müssen den Code für cin und cout nicht jedes Mal schreiben, wenn wir ihn verwenden. Oder einfacher gesagt können wir sagen, dass eine Bibliothek Codes für alle Funktionen enthält und eine Header-Datei der Weg ist, um diesen Code zu erreichen.

Shivam
quelle
1

Eine Bibliothek ist eine Sammlung ähnlicher Objekte zur gelegentlichen Verwendung. Es enthält normalerweise Programme in Objekt- oder Quellcodeform, Vorlagen usw.

Eine Header-Datei ist der Speicherort (Schnittstelle) der Bibliothek

Jayraj Srikriti Naidu
quelle
1

Der Header wird normalerweise verwendet, um die Prototypen zu enthalten. Header werden zur Vorverarbeitungszeit erweitert, sodass der Code zur Kompilierungszeit möglicherweise Zugriff auf relevante Funktionsdeklarationen / Prototypen hat.

Bibliothek ist die eigentliche Software, die die Definitionen der Funktionsprototypen enthält (im Header vorhanden). Die Bibliothek wird zur Verbindungszeit verwendet. Die Definitionen (in der Bibliothek vorhanden) werden zum Zeitpunkt der Verknüpfung aufgelöst.

Syed.Waris
quelle
0

Um einen klassischen Witz zu paraphrasieren, besteht der Unterschied darin, dass die Bibliothek eine Header-Datei hat, während die Header-Datei keine Bibliothek hat.

Tiberiu Ana
quelle
0

Bibliotheken sind wie tote Mumien, eingewickelt in weiße lange Fäden. Sie sind tot. Die einzige Möglichkeit, sie freizugeben, besteht in Header-Dateien. Header-Dateien enthalten Möglichkeiten, sie zum Leben zu erwecken, und sie können viele Male zum Leben erweckt werden (Wiederverwendung von Code).

Jatinpunia
quelle
2
Diese Analogie ist etwas ... zu abstrakt.
Byxor
0

Sie können dieses Beispiel betrachten , um Verständnis Math.heine Header - Datei, die den Prototyp für Funktionsaufrufe wie beinhaltet sqrt(), pow()etc, während libm.lib, libmmd.lib, libmmd.dlleinige der Mathematikbibliotheken sind. In einfachen Worten ist eine Header-Datei wie eine Visitenkarte und Bibliotheken sind wie eine reale Person. Daher verwenden wir eine Visitenkarte (Header-Datei), um die tatsächliche Person (Bibliothek) zu erreichen.

9121710
quelle
-4

Code aus Bibliotheken wird nur nach Bedarf für eine Header-Datei gespeichert. Die gesamte Header-Datei wird gespeichert, wodurch Speicherplatz für den Prozessor gespart wird.

Jerry
quelle
Willkommen bei StackOverflow und vielen Dank, dass Sie versucht haben zu helfen. Ihre Antwort kann jedoch an Nützlichkeit gewinnen, wenn Sie sie aus Gründen der Klarheit und Lesbarkeit umformulieren. Die Verwendung von Markdowns für die Formatierung kann hilfreich sein. Der Unterschied zwischen Headern und Bibliotheken hat andere, wichtigere Aspekte als die Menge, in der sie gespeichert sind.
Yunnosch