0Pricing
C Academy · レッスン

複数ファイルをコンパイルする

複数ファイルのプログラムをビルドします。

「複数ファイルをコンパイルする」はCoddyKit上の無料C Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。

ソースからプログラムへ

複数ファイルのCソースから実行可能ファイルを作る処理は、コンパイルとリンクの2段階で行われます。

各.cファイルは個別にコンパイルされ、オブジェクトファイルになります。その後、リンカーがすべてのオブジェクトファイルを結合し、ファイル間の参照を解決して、1つの実行可能なプログラムにします。

1コマンドでビルドする

最も簡単な方法は、すべてのソースファイルを一度にgccへ渡すことです。コンパイラがそれぞれをビルドし、その後自動的にリンクします。

-oフラグで出力プログラムの名前を指定します。すべての.cファイルを列挙してください。ヘッダーは#includeによって取り込まれるため、ここに列挙する必要はありません。

gcc main.c math_utils.c -o app

分割コンパイル

大規模なプロジェクトでは、-cを使って各ファイルをオブジェクトファイルにコンパイルします。これにより.oファイルが生成されますが、リンクは行われません。

個別にコンパイルすると、1つのソースだけを変更した場合、そのファイルだけを再コンパイルすればよいため、大規模なビルドを高速化できます。

gcc -c main.c        /* produces main.o */
gcc -c math_utils.c  /* produces math_utils.o */

リンクの手順

オブジェクトファイルがそろったら、それらをリンクして実行可能ファイルを作ります。ここではgccがリンカーとして動作し、オブジェクトを結合してファイル間のシンボルを解決します。

今回は最終的なプログラムが必要であり、別のオブジェクトファイルではないため、-cは指定しません。

gcc main.o math_utils.o -o app

リンカーの役割

リンカーは、シンボルの各使用箇所を、その定義に対応付けます。

main.oがaddを呼び出すと、リンカーはmath_utils.oに定義されたaddを見つけ、両者を結び付けます。また、プログラムが必要とする標準ライブラリのコードも取り込みます。

未定義参照エラー

リンク時にオブジェクトファイルを指定し忘れると、リンカーは定義を見つけられず、undefined referenceを報告します。

これはコンパイルエラーではなく、リンク時エラーです。各ファイルのコンパイルは正常に完了していますが、必要な定義が最後のコマンドに含まれていません。

gcc main.o -o app
/* undefined reference to `add' */
/* fix: include math_utils.o */

便利な警告フラグ

必ず警告を有効にしてコンパイルしてください。-Wallと-Wextraを指定すると、問題の可能性がある箇所を早期に見つけられます。

-std=c11を追加すると言語規格が選択され、コンパイラが変わっても動作を予測しやすくなります。これらのフラグは、1段階でコンパイルする場合にも分割して行う場合にも使えます。

gcc -Wall -Wextra -std=c11 -c main.c
gcc -Wall -Wextra -std=c11 -c math_utils.c
gcc main.o math_utils.o -o app

インクルードパス

ヘッダーが別のディレクトリにある場合は、-Iを使ってコンパイラに検索場所を伝えます。

たとえば-Iincludeを指定すると、include/フォルダーが検索パスに追加されます。そのため、別のフォルダーからでも#include "math_utils.h"を解決できます。

gcc -Iinclude -c src/main.c -o build/main.o

再コンパイルが重要な理由

分割コンパイルは、1つのファイルだけを変更した場合に効果を発揮します。そのファイルのオブジェクトだけを再コンパイルし、その後で再リンクします。

ただしヘッダーを編集した場合は、そのヘッダーをインクルードしているすべてのソースを再コンパイルする必要があります。ヘッダーの内容が、それぞれのソースの一部になるためです。

/* edited math_utils.c only */
gcc -c math_utils.c
gcc main.o math_utils.o -o app

makeによる自動化

コマンドを手作業で入力するのは面倒です。Makefileにルールを記録しておけば、変更されたものだけを再ビルドできます。

この最小限の例では、2つのオブジェクトをリンクしてappを作ります。makeはファイルのタイムスタンプを追跡し、再コンパイルが必要なものを判断します。

app: main.o math_utils.o
	gcc main.o math_utils.o -o app

main.o: main.c math_utils.h
	gcc -c main.c

ビルド全体のまとめ

これは、小規模なプロジェクトでオブジェクトファイルから警告付きの完成プログラムを作るまでの全体の流れです。

各ソースをコンパイルしてから、オブジェクトをリンクします。最後に実行して、最初から最後まで正常に動作することを確認します。

gcc -Wall -c main.c
gcc -Wall -c math_utils.c
gcc main.o math_utils.o -o app
./app

理解度チェック

複数ファイルのビルド手順について理解できているか確認しましょう。

まとめ

各.cファイルを-cでオブジェクトファイルにコンパイルし、その後オブジェクトをリンクしてプログラムにする方法を学びました。警告には-Wallを、インクルードパスには-Iを使います。

undefined referenceは、リンク時に必要なオブジェクトが不足していることを意味します。makeなどのツールを使うと、変更されたものだけを自動的に再ビルドできます。

よくある質問

「複数ファイルをコンパイルする」レッスンは無料ですか?

はい。「複数ファイルをコンパイルする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。

「複数ファイルをコンパイルする」で何を学びますか?

複数ファイルのプログラムをビルドします。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「複数ファイルをコンパイルする」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC Academyレッスンでコードを書いて実行できますか?

はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ヘッダーファイルとソースファイル
  2. インクルードガード
  3. externとリンケージ
  4. 複数ファイルをコンパイルする
← C Academyに戻る