カテゴリ: C++ 更新日: 2026/02/05

C++のコンパイルとリンクの仕組みを初心者向けに解説

コンパイルとリンクの仕組み
コンパイルとリンクの仕組み

先生と生徒の会話形式で理解しよう

生徒

「C++で作ったプログラムを実行するには何をするんですか?」

先生

「C++では、まずコンパイルをしてソースコードを機械語に変換し、次にリンクをして一つの実行ファイルにまとめます。」

生徒

「コンパイルとリンクの違いがよくわかりません…。」

先生

「簡単にいうと、コンパイルはレシピを翻訳して調理手順に変える作業、リンクは別々の材料を一つの完成料理にまとめる作業です。」

1. コンパイルとは?

1. コンパイルとは?
1. コンパイルとは?

C++のソースコード(.cppファイル)は、人間が読める言葉で書かれています。コンパイルとは、このコードをコンピュータが理解できる機械語(オブジェクトファイル)に変換する作業です。例えると、英語のレシピを日本語に翻訳するような作業です。


// コマンド例(GCC)
g++ -c src/main.cpp -o build/main.o

このコマンドでは、main.cppをコンパイルしてmain.oというオブジェクトファイルを作成しています。-cオプションが「コンパイルのみ」を意味します。

2. リンクとは?

2. リンクとは?
2. リンクとは?

リンクは、複数のオブジェクトファイルやライブラリを組み合わせて一つの実行可能ファイルにまとめる作業です。例えば、src/main.oとsrc/greeting.oを一つにしてbuild/my_programという実行ファイルを作る作業です。


// コマンド例(GCC)
g++ build/main.o build/greeting.o -o build/my_program

この作業がないと、コンパイルしただけではプログラムを実行できません。リンクは「完成品を作る最後の工程」と考えるとわかりやすいです。

3. コンパイルとリンクの流れ

3. コンパイルとリンクの流れ
3. コンパイルとリンクの流れ

一般的なC++プロジェクトでは、次のような流れになります:

  1. srcにある.cppファイルをコンパイルしてオブジェクトファイル(.o)を作る
  2. includeフォルダのヘッダファイル(.h/.hpp)を参照しながら、必要な関数やクラスの情報を取り込む
  3. 複数のオブジェクトファイルをリンクして、最終的な実行ファイルをbuildフォルダに作成する

// 全体の流れ(GCCの場合)
g++ -c src/main.cpp -o build/main.o
g++ -c src/greeting.cpp -o build/greeting.o
g++ build/main.o build/greeting.o -o build/my_program

これでbuild/my_programを実行すれば、プログラムが動作します。

4. ヘッダファイルとリンクの関係

4. ヘッダファイルとリンクの関係
4. ヘッダファイルとリンクの関係

ヘッダファイル(.h/.hpp)は、関数やクラスの宣言だけを書きます。実体は.cppに書かれているので、コンパイル時に「宣言を知る」ために必要です。リンク時に実体が結合され、最終的な実行ファイルが生成されます。


// include/greeting.hpp
#ifndef GREETING_HPP
#define GREETING_HPP

void sayHello();

#endif

// src/greeting.cpp
#include <iostream>
#include "greeting.hpp"

void sayHello() {
    std::cout << "Hello World!" << std::endl;
}

このように、ヘッダファイルは「約束事」、cppファイルは「実際の処理」というイメージです。

5. MakefileやCMakeで自動化

5. MakefileやCMakeで自動化
5. MakefileやCMakeで自動化

大きなプロジェクトでは、手動でコンパイル・リンクを行うのは大変です。MakefileやCMakeを使うと、自動的に依存関係を解析してコンパイル・リンクを実行してくれます。これにより、初心者でも効率的にC++開発ができます。


# Makefile例
all: my_program

my_program: main.o greeting.o
    g++ main.o greeting.o -o my_program

main.o: src/main.cpp
    g++ -c src/main.cpp -o main.o

greeting.o: src/greeting.cpp
    g++ -c src/greeting.cpp -o greeting.o

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

C++のコンパイルとは具体的にどのような作業を指すのでしょうか?初心者にもわかりやすく教えてください。

C++におけるコンパイルとは、人間がプログラミング言語(C++)で書いた「ソースコード」を、コンピュータの心臓部であるCPUが直接理解して実行できる「機械語」に変換する翻訳作業のことです。ソースコードのファイル形式である「.cppファイル」を、中間的なデータである「オブジェクトファイル(.oファイル)」へと作り変える工程を指します。料理に例えるなら、英語で書かれた難解なレシピ本を、キッチンのスタッフがすぐに動けるような具体的な指示書に翻訳する作業と言えます。この工程があることで、私たちが書いたプログラムがコンピュータ上で動作する準備が整います。
カテゴリの一覧へ
新着記事
New1
C++
C++のメンバアクセス演算子を完全解説!初心者でもわかる . → :: の使い方まとめ
New2
Rust
Rustの文字列を極める!&str(文字列スライス)の基本概念とString型との違い
New3
C++
C++のキャスト演算子を完全解説!dynamic_cast・static_cast・const_cast・reinterpret_castを初心者向けに説明
New4
C++
C++開発のIDE選びを完全ガイド!初心者でもわかるCLion・Eclipse CDT・Qt Creator比較
人気記事
No.1
Java&Spring記事人気No1
C++
C++の主要な実装をわかりやすく解説!GCC・Clang・MSVCの違いと特徴
No.2
Java&Spring記事人気No2
C言語
C言語を学ぶ初心者におすすめの環境構築手順【2025年版】
No.3
Java&Spring記事人気No3
C言語
C言語のソースコードとヘッダファイルの役割とは?初心者向けにわかりやすく解説!
No.4
Java&Spring記事人気No4
C言語
C言語をオンラインで実行できる便利なコンパイラサービスまとめ【初心者向け】
No.5
Java&Spring記事人気No5
C言語
Visual Studio CodeでC言語を実行する方法【拡張機能の設定と実行手順】
No.6
Java&Spring記事人気No6
C言語
C言語開発でよく使われるエディタとIDEランキング【初心者向け完全ガイド】
No.7
Java&Spring記事人気No7
C++
C++リンカとコンパイラのオプション設定を完全ガイド!初心者にもわかる開発環境の基礎
No.8
Java&Spring記事人気No8
C言語
C言語の列挙型(enum)の使い方を完全ガイド!初心者でもわかる基本操作