複数の部品をひとつにまとめる!「リンカ(linker)」とは?C言語の基本をやさしく解説
C言語のプログラムは、ソースコードをコンパイルしただけではまだ実行できません。
複数の部品(オブジェクトファイルやライブラリ)をつなぎ合わせる必要があります。
この作業を行うのが リンカ(linker) です。
リンカとは?
リンカ(linker)は、複数のオブジェクトファイル(.o)やライブラリを結合して、実行可能なプログラムを作るツールです。
コンパイラが作るのは中間ファイルであり、それらを組み合わせるのがリンカの役割です。
処理の流れ(イメージ)
- ソースコード(.c)を
gcc -c
でコンパイル → オブジェクトファイル(.o)を作成
- 複数のオブジェクトファイルを
リンカ
で結合 → 実行ファイル(.exeやa.outなど)を作成
gccでのリンカの自動処理
gcc main.c util.c -o app
gcc
は、実際にはコンパイル+リンクの2段階を自動で実行しています。
手動でコンパイル&リンク
gcc -c main.c // main.o を作成
gcc -c util.c // util.o を作成
gcc main.o util.o -o app // リンカで結合
リンカの主な役割
- 関数や変数の参照先を正しく接続する(例:
main
がadd()
を使う)
- ライブラリ(標準ライブラリや自作ライブラリ)との接続
- 最終的な「実行可能ファイル」を作成する
リンクエラーとは?
関数や変数が見つからないとき、リンカが失敗し リンクエラー になります。
例:
// main.c
int main() {
func(); // funcの定義がない
}
→ undefined reference to 'func'
のようなエラーになります。
ライブラリとのリンク
gcc main.c -lm
-lm
は math.h のライブラリ(libm)をリンクするオプションです。
他にも -lpthread
(スレッド)などがあります。
まとめ
リンカ(linker)は、コンパイルされた複数のファイルをつなぎ合わせて実行ファイルを作る重要な役割を持ちます。
小さなプログラムではあまり意識しませんが、大きなプロジェクトや複数ファイル構成では欠かせない存在です。
初心者の方は、まずはgcc file.c -o output
の裏側で、コンパイル → リンクが行われていることを理解しましょう!