質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

#includeとリンクの違いはなんでしょうか

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 9,226

score 82

こんにちは

c言語で、#includeとリンクの違いはなんでしょうか。
両方同じに思えます。
両方とも、様々な部品(ファイル)を合体させるものではないでしょうか・・・??

もし宜しければ回答お願い致します。


  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+4

宣言などをコピペするのが面倒だから使うのがinclude、
実行ファイルを作るために必要なのがリンクです。

関数void Hoge(void)があったとします。

//Hoge.c
void Hoge(void);
void Hoge(void){
    //Do something.
}

これを別のソースで使いたいとします。

//UseHoge.c
void UseHoge(void);
void UseHoge(void){
    Hoge();
}

このままだとUseHoge.cはコンパイルできません。(開発環境によっては通っちゃいますが。)
なぜならvoid Hoge(void)の宣言がないからです。
なので宣言をベタ書きで追加しておきます。

//UseHoge.c
void Hoge(void);

void UseHoge(void);
void UseHoge(void){
    Hoge();
}

これでUseHoge.cのコンパイルが通ります。

しかしベタ書きだと、また別のソースファイルで使いたかったり、
関数の数が多い時に一つ一つベタ書きしなければならないので面倒です。
タイプミスも心配です。

そこでなんか適当なファイルに宣言を書いておいて、そこからコピペすることにしましょう。
//Hoge.h
void Hoge(void);

これで多少楽になりました。
しかしまだ一々コピペするのは面倒です。

includeはこのための機能です。
#include "Hoge.h"
と書けば、Hoge.hの中身を展開、ざっくり言えば文字列的にコピペされているものとしてコンパイルします。

さて、コンパイルで生成されたオブジェクトファイルには
void Hoge(void)の宣言はあるが、定義がないもの」が出てきます。
実行するにはvoid Hoge(void)の定義されているオブジェクトファイルを含めて、
1つの実行ファイルなどにまとめる必要があります。
これがリンカの役割です。

(なので、宣言がないものを使おうとするとコンパイラに怒られ、宣言だけあって定義がどこにもない場合はリンカに怒られます。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/17 09:37

    回答ありがとうございます!

    実際にコードも書いて説明してくださりありがとうございます!
    視覚的にもわかりやすく、理解できました!

    ありがとうございます!

    キャンセル

+4

合体という言葉を使うならば、
ソースコードレベルで合体させるのと、オブジェクトコードレベルで合体させるのとの違いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/15 07:46

    回答有り難うございます!

    もし宜しければ、その他の違いも教えていただけないでしょうか
    m(__)m

    すみません

    キャンセル

  • 2015/10/15 09:51

    違いというか、この質問を見るまで、両者が似ていると考えたことはないです。全くの別物。
    「includeとは何か」「リンクとは何か」を個別にしっかり学習してください。

    キャンセル

+2

includeは読んで字の如く、そのソースコード内に含めてしまうということです。
コンパイルした後のオブジェクトファイルには、自分が書いたソースコードと、includeで指定したヘッダーファイルの内容がすべて含まれます。

リンクの場合は、リンク先の内容がオブジェクトファイルに含まれることはありません。
合体というならば、こちらの方がよりそれっぽいでしょう。
オブジェクトファイルとライブラリファイルが合体し、1つの実行ファイルになります。

ちなみにリンクには、ダイナミックリンクとスタティックリンクがあります。
スタティックリンクの場合は、ビルド(コンパイル+リンク)時に合体しますが、ダイナミックリンクの場合は共有ライブラリ(.dll、.soなど)と実行時に合体します。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/17 09:37

    回答ありがとうございます!
    「含める」と「合体」の違いがあったのですね!

    そして、共有ライブラリのことを知らなかったので調べてみます!ありがとうございました!

    キャンセル

+1

include はテキストファイルレベルの話です。
link は バイナリーファイルレベルの話です。

 ... 両方とも、様々な部品(ファイル)を合体させるもの...
この捉え方は適切ではありません。
次のように考えると良いかもしれません。

 include
 ==> ソースファイルの中に 他のソールファイルを 取り込む事  を指示する記述です。
     英語の include の意味 (含める) そのものです。

link
 ==> オブジェクトから実行ファイルを作成することです。
     そのオブジェクトに中で定義されていない照関数や定数をつかっている(参照している)ことがあります。
     プログラムとして実行するときは、それらの参照先が実際に存在していないと動作しません。
     link とは、この参照先を解決するようにする作業です。
     つまり参照(呼び出し) 元と定義を link (結びつける) させているのです。
     必ずしも合体させているわけではありません。
     (全部を1つにまとめてしまって 結びつきを解消させる場合もあるし、参照先を他のファイルやメモリー中の位置として解消させる場合もあります)

参考:
- #include ディレクティブ https://msdn.microsoft.com/ja-jp/library/36k2cdd4(v=vs.120).aspx.aspx)
  > ...
  > 指定されたファイルの内容をソース プログラムに読み込むように、このディレクティブが出現した時点でプリプロセッサに指示します。
  > ...

- コンパイルとリンク方法 http://keicode.com/winprimer/wp02.php
  > ...
  > ビルドは、コンパイルとリンクを実行し、実行可能ファイルを作成する処理のことです。 
  > コンパイルでは、ソースファイル (*.cpp や *.h) からオブジェクトファイル (*.obj) を生成します。 
  > リンクでは、オブジェクトファイル (*.obj) やライブラリファイル (*.lib) から実行可能ファイルを作成します。
  > ...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/17 09:45

    回答ありがとうございます!

    添付されたURLの記事、とても役に立ちます!!
    いろいろ難しい単語であったり、何となにが違うのかとか、線引きがむずかしかったりして、teratailで暴走状態になっていますが、いつも回答してくださり感謝しています

    ありがとうございます

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る