ヘッダーファイルとライブラリの違いは何ですか?


80

私が理解するのに苦労していることの1つは、コンパイラーがどのように機能するかです。私はそれで多くの問題を抱えていますが、特に私はヘッダーとライブラリを混同し続けています。誰かが少し物事を片付けることができれば、それは素晴らしいことです。


1
CとC ++は異なるプログラミング言語です。そして、両方があるの仕様のように、書かれた(主に英語で)いくつかの標準では- !-notソフトウェアn1570 C用とn3337 C ++のために
バジーレStarynkevitch

回答:


126

両方をこのように考えてください(免責事項:これは本当に高レベルのアナロジーです;)..

  • ヘッダは一方で、あなたが呼び出すことができる電話番号です...
  • ...図書館はあなたがそこに到達できる実際の人です!

これが「インターフェース」と「実装」の根本的な違いです。インターフェース(ヘッダ)がわかりますどのようにしながら、(それがどのように動作するかを知らずに)いくつかの機能を呼び出すために実装(ライブラリ)が実際の機能です。

注:この概念は非常に基本的です。柔軟性が得られるためです。異なるライブラリーに対して同じヘッダーを持つことができ(つまり、機能はまったく同じ方法で呼び出されます)、各ライブラリーは異なる方法で機能を実装できます。同じインターフェイスを維持することでコードを変更せずにライブラリを置き換えることができます。

そして:呼び出し元のコードを壊すことなく、ライブラリの実装を変更できます!


2
ええと...私はまだここで何かを得ていません。一つには、ライブラリがどのように派生するのか完全にはわかりません。私がコンパイルしたすべてのプログラムは、ライブラリを必要としないようです。それらは生成されないだけです。ライブラリを定義する必要があると思いますか?しかし、それを無視すると、メインのソースファイルはどこで機能しますか?ヘッダーは実装用で、メインのソースファイルはインターフェイス用だと思いました。ライブラリは実行可能ファイルをコンパイルするためにのみ必要でした...とにかく静的な場合。
xonara 2009年

2
ライブラリーはプログラムされています:プログラムを書くことも、ライブラリーを書くこともできます。
TomTom 2012年

2
他の人からライブラリを入手した場合Util.lib。例それを関数と呼ぶ方法は?Uにも関連するヘッダーファイルをインクルードする必要がありますtil.libか?
エルシャン2016年

ヘッダーについては、私はあなたの主張を理解しましたが、実装に関しては、まだ混乱しています。一般的に、ソースファイルには実装権が含まれているのでしょうか?すでにソースファイルがある場合、なぜライブラリが必要なのですか?よろしくお願いします!
ミラノ

57

ヘッダファイルがされ、一般的にアプリケーション内のインターフェイスのインターフェイスまたはセットを定義するために使用されます。ヘッダーファイルは、技術的な実装の詳細を省略しながら、プログラムの外部機能を示すものと考えてください。

たとえば、プログラムを最適化する場合、アルゴリズムを改善するためにソース(.cpp)ファイルを変更する可能性がありますが、外部クライアントは引き続き同じパラメーターセットを使用してメソッドを呼び出すため、ヘッダーファイルは変更されません。戻り値。

C ++のようなオブジェクト指向言語では、ヘッダーファイルには通常次のものが含まれます。

  • クラスの説明と継承階層
  • クラスデータのメンバーとタイプ
  • クラスメソッド

コードがヘッダーファイルに実装されるのを妨げるものは何もありませんが、コードに余分な結合と依存関係が生じる可能性があるため、これは一般的には好ましくありません。

場合によっては(テンプレートクラスなど)、技術的な理由から、実装をヘッダーファイルで定義する必要あります。


ライブラリは、あなたがプログラムまたはプログラムのグループに利用できるようにするコードの集まりです。これには、特定のインターフェースまたはインターフェースのセットの実装が含まれます。

コードは、コードの重複を防ぎ、再利用を促進するためにライブラリで定義されています。ライブラリは、静的リンク(.lib)または動的リンク(.dll)にすることができます。

  • 静的にリンクされたライブラリーは、その後、ビルドプロセスのリンク段階で最終的な実行可能ファイル(.exe)に連結されている(メソッドの定義と考えることができる)エクスポート・シンボルのセットを定義します。これには、実行時間が短縮されるという利点があります(ライブラリを動的にロードする必要がないため)。ただし、バイナリが大きくなります(メソッドは基本的に実行可能ファイルに複製されるため)。

  • 動的にリンクされたライブラリは、プログラムの実行ではなく、プログラムのリンク時にリンクされています。複数のプログラムが同じ方法を再利用する必要がある場合に役立ち、COMなどのテクノロジで広く使用されています。


10

混乱するかもしれないことの1つは、C ++ではライブラリという単語がいくつかの意味を持つ可能性があることです。ここでは、1つの意味について十分に説明しています。

バイナリファイル内のリンク可能な関数のセット。これらは静的にリンクすることも動的にリンクすることもできます。

ただし、別のタイプのライブラリがあります。いわゆるヘッダーのみのライブラリ(STL、TR1、およびBoostの一部を含む)です。これらは個別のバイナリ形式では存在しないため、ワードライブラリは特定のバイナリファイルではなく、インクルードされたヘッダーファイルのセットを参照します。

お役に立てれば。


8

ライブラリはコードであり、オブジェクトファイルのセットにコンパイルされます。オブジェクトファイルには、コンパイルされたマシンコードと、コードで使用されるデータ宣言が含まれています。

ヘッダーファイルは、ライブラリへのインターフェイスを定義します。ライブラリを正しく使用する方法を説明します。C / C ++では、ヘッダーファイルは関数名とそれらの関数の呼び出し方法のリストを提供します:それらが取るパラメーターの数とタイプ、戻り値の型、呼び出し規約など。ヘッダーファイルには他にもたくさんのものがあります。それらも同様ですが、結局のところ、ライブラリコードを呼び出すための一連のルールです。


8

ヘッダーには宣言のみが含まれますが、ライブラリには実装も含まれます。


2

プログラミング言語のライブラリが一般的なライブラリである場合、ライブラリに存在する多くの本を言語の関数/メソッドと比較できます。また、ヘッダーファイルを本の行番号と比較することもできます。ハイデラバードのある図書館に本があり、その図書館にその本が行番号24にあるとします...図書館の住所が指定されているのと同じ方法です。名前付けstd(標準ライブラリ用)と行Noを使用することにより、同時にすべての本(この場合はメソッド)(入力/出力ストリームに関連するすべてのメソッド)が配置されるヘッダーファイルによって指定されます


2

ヘッダーは通常、プロトタイプを格納するために使用されます。ヘッダーは前処理時に拡張されるため、コンパイル時にコードは関連する関数宣言/プロトタイプにアクセスできます。

ライブラリは、関数プロトタイプの定義を含む実際のソフトウェアです(ヘッダーにあります)。ライブラリはリンク時に使用されます。定義(ライブラリに存在する)はリンク時に解決されます。


1

ヘッダーファイルは機能を呼び出す方法を説明、ライブラリにはこの機能を実装するコンパイル済みコードが含まれています。


1

HEADER FILEは、関数の宣言が書き込まれるファイルです。ヘッダーファイルを使用すると、特定の関数にアクセスできます。

一方

LIBRARY FILEは、特定の関数の定義が記述されているファイルです。MATH.Hはヘッダーファイルであり、MATH.LIBはライブラリファイルです。


1

プログラムでのHEADERファイルとLIBRARYの動作。

ヘッダーファイルはへのリンク含まライブラリ全て解決さディレクティブ(ディレクティブは、プログラム内の行には、#記号が先行していることを(ライブラリは、標準的な機能および方法を含む)、コンパイラは、プリプロセッサを介してソースコードで使用される標準的な機能を認識する)プログラムの実際のコンパイルの前。

読んでくれてありがとう!


1

ライブラリは、何度も再利用され、そのコードがプリコンパイルされているコードのパッケージであると思います。したがって、標準形式で利用できるため、開発するすべてのプログラムに対してそのコードを記述する必要はありません。また、ヘッダーファイルには、「cin」や「cout」などのプログラムで使用する関数が標準ライブラリで完全に定義されている簡単な方法でそのコードへの参照が含まれ、iostreamヘッダーファイルなどのヘッダーファイルにはそのコードへの参照が含まれます。したがって、コードをコンパイルすると、cinとcoutのプリコンパイルが行われるだけで、使用するたびにcinとcoutのコードを記述する必要はありません。または、より簡単な方法で、ライブラリにはすべての関数のコードが含まれており、ヘッダーファイルがそのコードに到達する方法であると言えます。


1

ライブラリは、時々使用するための同様のオブジェクトのコレクションです。通常、オブジェクトまたはソースコード形式のプログラム、テンプレートなどが含まれます。

ヘッダーファイルは、ライブラリの場所(インターフェイス)です。


0

古典的なジョークを言い換えると、違いは、ライブラリにはヘッダーファイルがあり、ヘッダーファイルにはライブラリがないことです。


0

図書館は死んだミイラのようなもので、白い長い糸で包まれています。彼らは死んでいます。それらを解放する唯一の方法は、ヘッダーファイルを使用することです。ヘッダーファイルには、それらを実現する方法が含まれており、何度も実現できます(コードの再利用)。


2
このアナロジーは少し...抽象的すぎます。
byxor 2017

0

あなたはunderstand-にこの例を考えることができるMath.hような関数呼び出しのプロトタイプ含むヘッダファイルであるsqrt()pow()一方、などlibm.liblibmmd.liblibmmd.dll数学ライブラリの一部です。簡単に言うと、ヘッダーファイルは名刺のようなもので、図書館は実在の人物のようなものなので、名刺(ヘッダーファイル)を使用して実際の人物(図書館)にアクセスします。


-4

ライブラリからのコードは、ヘッダーファイルの必要に応じてのみ保存されます。ヘッダーファイル全体が保存されるため、プロセッサのストレージ領域が節約されます。


StackOverflowへようこそ。助けてくれてありがとう。ただし、わかりやすく読みやすくするために言い換えると、回答が役立つ可能性があります。フォーマットにマークダウンを使用すると役立つ場合があります。ヘッダーとライブラリの違いには、保存される量以外の重要な側面があります。
Yunnosch 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.