はじめに
本記事では、Ubuntu LinuxにおけるPOSIX準拠のC言語コンパイラインターフェース「c89」コマンドの活用法を解説します。レガシーかつ堅牢なC89(ANSI C)標準に沿ったコードのビルド手順、分割コンパイルによるオブジェクト生成、外部ライブラリのリンクに至る一連の実務プロセスを、シェル上でのハンズオン形式で整理しました。
開発環境のセットアップとc89ツールの稼働確認
検証を始めるにあたり、APTパッケージインデックスを最新化し、ビルド基盤となるgccおよびc89ツールセットを導入します。

パッケージ導入後、システムパス上に実行ファイルが正しく配置されたかをwhich c89でチェックします。

c89は、厳密なANSI C(C89/C90)仕様に準じたコンパイルを実施するためのPOSIX標準コマンドです。
Ubuntu上では内部的にgccを呼び出すラッパースクリプトとして実装されているため、バックエンドコンパイラの詳細構成やバージョン情報を取得する目的でc89 --version 2>/dev/null || gcc -vを実行してみます。
⚙️ [頻出主要オプション一覧]
-c : リンカの実行を抑止し、オブジェクトファイル(.o)の生成のみにとどめます。-o : 成果物となるバイナリ(実行ファイル)の出力ファイル名を指定します。-O : コードの実行効率を高めるための最適化処理を有効化します。-s : 実行バイナリからシンボル情報やデバッグ情報を削ぎ落とし、ファイル容量を削減します。-g : GDB等のデバッガで利用するためのデバッグシンボルを埋め込みます。-D : プリプロセッサマクロをコマンドライン引数経由で定義します。-U : 事前に定義されたプリプロセッサマクロの定義を解除(未定義化)します。-I : インクルード対象ヘッダーファイル探索先ディレクトリを追加します。-L : リンク処理時に検索する追加のライブラリ格納ディレクトリを指定します。-l : 結合対象となるライブラリ名を指定してリンクします。

ANSI C準拠プログラムの記述とバイナリ生成
動作確認用のサンプルとして、C89規格に準拠したシンプルなソースコードhello.cを標準出力経由で作成します。

ファイルの内容が意図通りに書き込まれているか、cat hello.cコマンドで確認しておきます。

c89コマンドを呼び出し、-oオプションで出力ファイル名をhelloに指定してコンパイルとリンクを一度に行います。

生成された実行バイナリ./helloを起動し、ターミナル上に文字列が想定通り出力されるか確かめます。

オブジェクトファイルの個別生成(-c)とリンクフェーズの分離
大規模プロジェクトで標準的に行われる分割コンパイルの流れを把握するため、検証用コードcalc.cを準備します。

-cフラグを付与してc89を実行することで、リンカを起動せずに機械語へ変換した中間生成物calc.oのみを出力させます。

ディレクトリ内にオブジェクトファイルcalc.oが正常に出力されているか、ls -l calc.oでタイムスタンプとファイルサイズを検証します。

先ほど生成した中間ファイルcalc.oを引数に渡し、-oオプションで最終成果物calcへとリンク結合します。

出来上がった実行可能プログラム./calcを実行し、変数処理と標準出力が意図通り行われているか確認します。

プリプロセッサマクロ定義(-D)と外部数学ライブラリ(-lm)の結合
コンパイル時マクロ制御および数学ライブラリのリンク挙動を確認するため、math.hを取り入れたソースapp.cを記述します。
![printf ‘#include <stdio.h>\n#include <math.h>\nint main(void) {\n#ifdef DEBUG\n printf("[DEBUG MODE]\n");\n#endif\n printf(“sqrt(49.0) = %%.2f\n”, sqrt(49.0));\n return 0;\n}\n’ > app.c](/ubuntu/20261016_012447_82/captures/s04_c01_printf___include__stdio_h__n_include__math_h__nint.png)
-DDEBUGでプリプロセッサフラグを注入しつつ、-lmを指定して標準数学ライブラリ(libm)をリンクさせた上で実行ファイルappをビルドします。

完成した./appを起動し、条件分岐されたデバッグ出力と平方根計算(sqrt)の結果が正しくターミナルへ反映されているか確かめます。

本稿では、Ubuntuにおけるc89コマンドを用いたANSI Cコードのビルド手順と実践的なコンパイル手法を解説しました。
レガシーコードの互換性維持やPOSIX準拠の厳格なビルド環境構築が求められる現場において、ぜひお役立てください。