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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

リンカ

リンカはコンパイルされたオブジェクトコードに、必要なライブラリなどを付け加えて、実行可能ファイルを生成するプログラムです。コンパイルされたオブジェクトのコードを複数のファイルで取得し、"linked"という一つの実行可能のファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

12206閲覧

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

question_april

総合スコア90

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

include

あるファイルで定義された関数や処理を、別のファイル上でも使用できるようにするプロセスをincludeと呼びます。

リンカ

リンカはコンパイルされたオブジェクトコードに、必要なライブラリなどを付け加えて、実行可能ファイルを生成するプログラムです。コンパイルされたオブジェクトのコードを複数のファイルで取得し、"linked"という一つの実行可能のファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/10/14 15:16

こんにちは

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

投稿2015/10/14 16:58

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

question_april

2015/10/14 22:46

回答有り難うございます! もし宜しければ、その他の違いも教えていただけないでしょうか m(__)m すみません
otn

2015/10/15 00:51

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

0

ベストアンサー

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

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

c

1//Hoge.c 2void Hoge(void); 3void Hoge(void){ 4 //Do something. 5}

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

C

1//UseHoge.c 2void UseHoge(void); 3void UseHoge(void){ 4 Hoge(); 5}

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

C

1//UseHoge.c 2void Hoge(void); 3 4void UseHoge(void); 5void UseHoge(void){ 6 Hoge(); 7}

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

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

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

C

1//Hoge.h 2void Hoge(void);

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

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

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

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

投稿2015/10/15 02:22

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

question_april

2015/10/17 00:37

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

0

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

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

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

投稿2015/10/15 00:37

編集2015/10/15 00:39
shanxia

総合スコア1038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

question_april

2015/10/17 00:37

回答ありがとうございます! 「含める」と「合体」の違いがあったのですね! そして、共有ライブラリのことを知らなかったので調べてみます!ありがとうございました!
guest

0

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

... 両方とも、様々な部品(ファイル)を合体させるもの...

この捉え方は適切ではありません。
次のように考えると良いかもしれません。

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

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

参考:

  • #include ディレクティブ https://msdn.microsoft.com/ja-jp/library/36k2cdd4(v=vs.120).aspx

    ...
    指定されたファイルの内容をソース プログラムに読み込むように、このディレクティブが出現した時点でプリプロセッサに指示します。
    ...

  • コンパイルとリンク方法 http://keicode.com/winprimer/wp02.php

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

投稿2015/10/15 14:57

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

question_april

2015/10/17 00:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問