📖 読了目安 約7分
この記事の目次

ビルドの基礎

ソースコードを実行可能なプログラムに変換する「ビルド」の仕組みを理解しましょう。

ビルドとは

ビルドとは、人間が書いたソースコードを、コンピュータが実行できる形式に変換する工程です。

ソースコード(.java、.cs、.cppなど)
        ↓
     【ビルド】
        ↓
実行ファイル(.exe、.dll、.jarなど)

ビルドの工程

ビルドは複数の工程から成り立っています。

1. コンパイル

ソースコードを機械語(または中間コード)に変換する工程です。

hello.c(ソースコード)
    ↓ コンパイル
hello.o(オブジェクトファイル)
言語 コンパイル結果
C/C++ 機械語(ネイティブコード)
Java バイトコード(.class)
C# IL(中間言語)

コンパイルエラーは、この段階で検出される文法ミスなどのエラーです。

2. リンク

複数のオブジェクトファイルやライブラリを結合して、1つの実行ファイルを作る工程です。

main.o ─┐
func.o ─┼→ リンク → program.exe
lib.a  ─┘

リンクエラーは、「呼び出そうとした関数が見つからない」などのエラーです。

3. パッケージング

実行に必要なファイルをまとめる工程です。

形式 説明
.jar Javaのアプリケーションパッケージ
.war JavaのWebアプリパッケージ
.apk Androidアプリパッケージ
.ipa iOSアプリパッケージ
.msi / .exe Windowsインストーラー

デバッグビルドとリリースビルド

ビルドには2つのモードがあります。

デバッグビルド(Debug)

開発・テスト用のビルドです。

特徴 説明
デバッグ情報 あり(行番号、変数名など)
最適化 なし(コードがそのまま実行される)
実行速度 遅い
ファイルサイズ 大きい

メリット

  • デバッガでステップ実行できる
  • 変数の値を確認できる
  • エラーの発生箇所が分かりやすい

リリースビルド(Release)

本番環境用のビルドです。

特徴 説明
デバッグ情報 なし(または最小限)
最適化 あり(コードが効率化される)
実行速度 速い
ファイルサイズ 小さい

メリット

  • 高速に動作する
  • ファイルサイズが小さい
  • 逆アセンブルされにくい(セキュリティ向上)

使い分け

場面 使うビルド
開発中 デバッグビルド
テスト中 リリースビルド
本番環境 リリースビルド

注意:デバッグビルドとリリースビルドで動作が異なる場合があります。本番環境に出す前に、必ずリリースビルドでテストしましょう。


静的リンクと動的リンク

ライブラリをプログラムに組み込む方法には2種類あります。

静的リンク(Static Link)

ビルド時にライブラリを実行ファイルに埋め込む方法です。

main.o + lib.a → program.exe(ライブラリ込み)
メリット デメリット
単体で動く(配布が簡単) ファイルサイズが大きくなる
依存関係がない ライブラリ更新時に再ビルドが必要

動的リンク(Dynamic Link)

実行時にライブラリを読み込む方法です。

program.exe + lib.dll → 実行時に結合
メリット デメリット
ファイルサイズが小さい DLLがないと動かない
ライブラリを共有できる DLLの配置が必要
ライブラリ更新が容易 バージョン互換性の問題

ライブラリファイルの種類

拡張子 OS 種類
.lib Windows 静的ライブラリ
.dll Windows 動的ライブラリ(Dynamic Link Library)
.a Linux/macOS 静的ライブラリ(archive)
.so Linux 動的ライブラリ(Shared Object)
.dylib macOS 動的ライブラリ

ビルドツール

言語やプロジェクトによって、使うビルドツールが異なります。

代表的なビルドツール

言語/環境 ビルドツール 特徴
C/C++ make 古典的だが今も使われる
C/C++ CMake クロスプラットフォーム対応
C#/.NET MSBuild Visual Studioが使用
Java Maven 依存関係管理も行う
Java Gradle Mavenより柔軟
JavaScript webpack フロントエンド開発で使用
Android Gradle Android Studioが使用

ビルドの自動化

現場では、ビルドを自動化していることが多いです。

  • CI/CD(継続的インテグレーション/デリバリー)
  • コードをプッシュすると自動でビルド・テストが実行される
  • Jenkins、GitHub Actions、GitLab CIなどを使用

インタプリタ型言語について

すべての言語がコンパイルを必要とするわけではありません。

コンパイル型言語 vs インタプリタ型言語

種類 説明
コンパイル型 事前に機械語に変換 C、C++、Go、Rust
インタプリタ型 実行時に1行ずつ解釈 Python、Ruby、JavaScript
中間コード型 中間コードにコンパイル→実行時に変換 Java、C#

インタプリタ型言語は「ビルド」という概念が薄いですが、実際の現場ではバンドル(複数ファイルをまとめる)やトランスパイル(別の言語に変換)という工程があります。


よくあるビルドエラー

コンパイルエラー

エラー 原因
syntax error 文法ミス(セミコロン忘れなど)
undeclared identifier 変数や関数が宣言されていない
type mismatch 型が合っていない

リンクエラー

エラー 原因
undefined reference 関数の実体がない
multiple definition 同じ関数が複数定義されている
library not found ライブラリが見つからない

対処法

  1. エラーメッセージを読む(最初のエラーから対処)
  2. エラーの発生箇所を確認
  3. 検索する(エラーメッセージをコピーして検索)
  4. 先輩に聞く

まとめ

概念 説明
ビルド ソースコードを実行可能な形式に変換
コンパイル ソースコードを機械語に変換
リンク オブジェクトファイルとライブラリを結合
デバッグビルド 開発用(デバッグ情報あり、遅い)
リリースビルド 本番用(最適化あり、速い)
静的リンク ライブラリをビルド時に埋め込む
動的リンク ライブラリを実行時に読み込む

ビルドの仕組みを理解していると、エラーが発生したときに「どこで問題が起きているのか」を特定しやすくなります。