リンクとは、コンパイル済みの部品やライブラリを結び、プログラムとして使える形へ近づける工程です。
ここでいうリンクは、Webページのリンクではありません。プログラムを作る流れの中で、複数の部品を結合する意味のリンクです。

リンクは「変換」ではなく「結びつける」工程です。コンパイルと役割を分けて読むと整理できます。
この記事では、リンクの意味、コンパイルとの違い、リンクエラーが起きる理由、ビルドログでの見分け方を初心者向けに解説します。親記事としてコンパイルとは?も合わせて確認してください。
まず結論:リンクは部品を結びつける工程
大きなプログラムは、1つのファイルだけでできているとは限りません。複数のソースファイル、外部ライブラリ、標準ライブラリなどを使います。コンパイルで部品を作ったあと、それらを結びつける工程がリンクです。
次の図で見るポイントは、リンクがコンパイル済みの部品とライブラリを結びつける位置にあることです。

コンパイルとの違い
コンパイルは、ソースコードを実行環境が扱いやすい形へ変換する作業です。一方、リンクは変換済みの部品を結びつける作業です。
次の比較図で見るポイントは、コンパイルが「部品を作る」、リンクが「部品をつなぐ」という役割の違いです。

| 工程 | 何を見るか | 失敗例 |
|---|---|---|
| コンパイル | 文法、型、名前 | セミコロン不足、型不一致 |
| リンク | 参照先、ライブラリ、部品の結合 | 関数が見つからない、ライブラリ不足 |
| ビルド | 成果物作成全体 | コンパイル、リンク、テストの失敗 |
リンクエラーとは
リンクエラーとは、部品同士を結びつける段階で、必要な参照先が見つからない状態です。たとえば、呼び出している関数の実体がない、必要なライブラリが指定されていない、バージョンが合わない、といった場合に起きます。
CやC++ではリンクという工程が見えやすいですが、JavaやTypeScriptでも、依存関係やライブラリ解決の失敗として似た問題に出会います。厳密な用語は環境ごとに違いますが、考え方としては「必要な部品が見つからない」と見ると理解しやすいです。
ビルドとの関係
ビルドは、コンパイルやリンク、テスト、成果物作成などを含む広い作業です。リンクは、その中の一工程として出てくることがあります。
そのため現場で「ビルドが落ちた」と言われたときは、まずログを見て、コンパイルで落ちたのか、リンクで落ちたのか、テストで落ちたのかを切り分けます。ビルド全体はビルドとは?の記事で整理しています。
リンクエラーを読むときのポイント
Javaプロジェクトでは、依存関係の管理にMavenを使うことがあります。ライブラリ解決とビルドの流れはMavenとは?の記事と合わせると理解しやすくなります。
ネットワークのリンクとは別物
IT用語では、同じ「リンク」でも文脈によって意味が変わります。ネットワークでリンクと言う場合は通信経路や接続を指すことがありますが、この記事ではプログラムのビルド工程におけるリンクを扱っています。
まとめ
リンクを理解すると、ビルド失敗を「全部同じエラー」と見ずに、コンパイル、リンク、テストのどこで止まったのかを分けられるようになります。
リンクが必要になる理由
小さなサンプルプログラムだけを見ていると、リンクという工程は見えにくいかもしれません。しかし実際の開発では、1つのプログラムが複数のファイルや外部ライブラリで構成されることが多く、部品同士の関係を解決する必要があります。
たとえば、あるファイルで関数を呼び出していても、その関数の実体が別ファイルやライブラリにある場合があります。コンパイルだけでは「呼び出しの書き方」は確認できても、最終的にどの実体へつなぐかまでは別の工程で確認されることがあります。
リンクは、この参照関係をそろえる工程です。呼び出している名前、必要なライブラリ、成果物に含める部品、実行時に見つけるべき共有ライブラリなどを結びつけます。
| リンクで見るもの | 不足すると起きること | 確認例 |
|---|---|---|
| 関数やメソッドの実体 | 未定義参照になる | 別ファイルがビルド対象か見る |
| 外部ライブラリ | ライブラリが見つからない | 依存設定やパスを見る |
| バージョン | 実体はあるが互換性がない | 依存のバージョンをそろえる |
| 実行時の配置 | 起動時に見つからない | 成果物と実行環境を確認する |
静的リンクと動的リンクの入り口
リンクには、静的リンクと動的リンクという考え方があります。初心者の段階では、細かいオプションを覚えるより、ライブラリを成果物に取り込むのか、実行時に外部から読み込むのかという違いとして押さえると十分です。
静的リンクは、必要な部品を実行ファイル側に取り込むイメージです。動的リンクは、実行時に共有ライブラリを参照するイメージです。どちらにも利点と注意点があり、配布のしやすさ、ファイルサイズ、更新のしやすさ、実行環境への依存が変わります。
この違いを知らなくても普段のWeb開発は進められますが、ビルドログにライブラリ名や参照解決のエラーが出たときに、単なる文法ミスではないと判断できるようになります。
JavaやWeb開発ではどう見えるか
JavaではC/C++ほどリンクという言葉を前面に出さない場面もありますが、依存関係の解決やクラスの読み込みで似た問題に出会います。必要なクラスが見つからない、jarが足りない、バージョンが合わない、といった問題です。
Web開発でも、npmやbundlerが依存ファイルをまとめる過程で似た考え方が出てきます。厳密には環境ごとに用語が異なりますが、ログに「見つからない」「解決できない」「読み込めない」と出る場合は、コンパイルの文法チェックではなく、部品の結びつきに問題がある可能性を考えます。
リンクエラーを質問するときに整理する情報
リンクエラーは、コードの該当行だけを見ても解決できないことがあります。必要な部品がビルド対象に入っているか、ライブラリの設定が合っているか、実行時に参照できる場所へ配置されているか、といった周辺情報が重要になるためです。
質問や調査をするときは、エラーに出ている未解決の名前、使っている言語やビルドツール、追加したライブラリ、ローカルとCIのどちらで失敗するかを整理します。これらが分かると、単なる書き間違いなのか、依存関係の設定ミスなのかを判断しやすくなります。
特にチーム開発では、ビルドスクリプトや依存管理ファイルが正しいかどうかも確認対象です。自分の端末だけに入っているライブラリに依存していると、他の人やCIではリンクできないことがあります。
リンクを理解しておくと、ビルド失敗を「コンパイルが落ちた」と一括りにせず、変換で止まったのか、部品の結合で止まったのか、実行時の読み込みで止まったのかを分けて説明できるようになります。
この用語を覚えるときの軸
最後に、この用語は単独で暗記するより、コンパイル、ビルド、実行、エラー調査の流れの中で見ると定着しやすくなります。リンクは、コンパイル済みの部品やライブラリを結び、実行できる形へ近づける工程として理解する。
初心者の段階では、細かい内部仕様をすべて覚える必要はありません。まずは、いつ起きる話なのか、何を入力として何を出力するのか、失敗したときにどのログやファイルを見るのかを押さえることが大切です。
この視点を持っておくと、記事を読み終えた後に別の環境や別の言語で似た言葉が出てきても、完全に新しい概念としてではなく、既に知っている開発工程の一部として整理できます。
用語を説明できるようにするだけでなく、実際にログを見たときに「今どの段階の問題なのか」を判断できる状態を目標にすると、学習内容が実務の調査に結びつきます。
