C++のリンク(Link)とは?コンパイルとの違いとエラー対策を解説!
C++でプログラムを書くとき、「コンパイルは通ったのに動かない」という経験をしたことはありませんか?
それは「リンク(Link)」の段階でエラーが起きている可能性があります。
この記事では、リンクの意味や役割、リンクエラーの原因と対策について、初心者向けにわかりやすく解説します。
リンク(Link)とは?
リンクとは、コンパイルされた複数のオブジェクトファイルやライブラリを1つの実行ファイルにまとめる処理のことです。
この処理を行うソフトウェアを「リンカ(Linker)」と呼びます。
ビルドの流れ(簡略版)
- プリプロセス:
#include
や #define
の処理
- コンパイル:各ソースファイルを機械語に変換(*.o や *.obj)
- リンク:オブジェクトファイルやライブラリを1つに結合(*.exe など)
つまり、リンクは「部品を組み立てる作業」とも言えます。
リンクが必要な例
複数のソースファイルに分けて開発していると、リンクが必要になります。
// main.cpp
void hello();
int main() {
hello();
return 0;
}
// hello.cpp
#include <iostream>
using namespace std;
void hello() {
cout << "Hello, world!" << endl;
}
この場合、main.cpp
と hello.cpp
をそれぞれコンパイルし、最後にリンクして結合する必要があります。
g++ main.cpp hello.cpp -o hello
リンクエラーの例と原因
エラー例 | 原因 |
undefined reference to `関数名` | 関数の定義が見つからない |
multiple definition of `関数名` | 同じ関数が複数定義されている |
ライブラリが見つからない | -lオプションでライブラリの指定忘れ |
リンクエラーは関数や変数の定義不足、重複、外部ライブラリ未指定が原因になることが多いです。
外部ライブラリのリンク例
// mathライブラリ(-lm)のリンク
g++ calc.cpp -o calc -lm
ライブラリのリンクには -l
(小文字のエル)オプションを使います。
静的リンクと動的リンク
種類 | 特徴 |
静的リンク | 必要なコードを実行ファイルに埋め込む(大きくなるが独立) |
動的リンク | 外部ファイル(DLLなど)に依存(軽いが実行時に必要) |
まとめ
C++のリンク(Link)は、コンパイルされたファイル同士を結合して最終的なプログラムを作る工程です。
関数や変数が複数ファイルに分かれているときは、正しいリンクが必要になります。
リンクエラーが出たら「定義が漏れていないか」「ライブラリの指定が正しいか」をチェックしてみましょう!