🐧 Linux 総合学習プラットフォーム

C・ビルドツールの用語集(17語)

C・ビルドツールに関する Linux 用語を、読み・意味・補足つきでまとめました。

Makefileめいくふぁいる
make コマンドが読む、ビルド手順を記述した設定ファイル。
ターゲット・依存ファイル・実行コマンドの組を並べて書きます。make はファイルの更新時刻を比較し、変更があった部分だけを再ビルドするため無駄がありません。コマンド行の字下げはスペースではなくTAB文字でなければならず、間違えると Missing separator エラーになる点が初心者のつまずきどころです。
out-of-sourceビルドあうとおぶそーすびるど
ソースコードとは別のディレクトリにビルド成果物をまとめて生成する方式。CMakeで標準的。
ビルドで生成されるMakefileやオブジェクトファイルを、ソースコードと同じ場所ではなく専用のディレクトリ(buildなど)にまとめて出力する方式。ソースディレクトリが生成物で汚れず、やり直したいときはビルドディレクトリごと削除するだけでよい。CMakeではcmake -B buildのように指定して行うのが一般的。
sonameそーねーむ
共有ライブラリの互換性を保つためのバージョン付き内部名。libX.so.1のような形。
共有ライブラリの実体ファイル(libX.so.1.0.0など)とは別に持たせる、実行時に検索される論理的な名前。パッチ版のアップデートで実体ファイルが入れ替わっても、sonameが同じであればリンク済みのプログラムはそのまま動き続けられる。互換性が壊れる大きな変更をしたときだけsonameの番号を上げる運用が一般的。
オブジェクトファイルおぶじぇくとふぁいる
ソースを機械語へ変換した、リンク前の中間ファイル(.o)。
gcc -c で生成され、拡張子は .o です。機械語にはなっていますが、他のファイルやライブラリとリンクするまでは単体では実行できません。大きなプログラムをソースごとに .o へ分けておくと、変更したファイルだけ作り直せて効率的です。
コンパイルこんぱいる
人が書いたソースコードを、CPUが実行できる機械語へ翻訳する処理。
広義にはソースから実行ファイルを作る一連の流れ全体を指し、狭義にはC言語をアセンブリへ翻訳する工程を指します。gcc はこの翻訳を担うコンパイラの代表で、前処理・コンパイル・アセンブル・リンクの4段階を内部で順に実行します。
ターゲット/依存関係たーげっと/いぞんかんけい
Makefileで「作るもの」と「そのために必要なもの」を結ぶ関係。
Makefileの各ルールは「ターゲット: 依存ファイル」の形で書き、ターゲットは生成したい成果物(実行ファイルや .o)、依存ファイルはそれを作るのに必要な入力です。make は依存ファイルがターゲットより新しいときだけコマンドを実行します。clean のように実ファイルを作らない便宜的なターゲットもあります。
パターンルールぱたーんるーる
%.o: %.c のように拡張子どうしの変換規則を1行でまとめて表すMakefileの書き方。
個々のファイル名を列挙する代わりに、%という記号を使って「この拡張子のファイルからあの拡張子のファイルを作る」という規則を1回だけ定義する仕組み。対象になるファイルがいくつあっても同じルールが適用されるため、ソースファイルが増減してもMakefile本体をほとんど書き換えずに済む。
フォニーターゲットふぉにーたーげっと
.PHONYで宣言する、実ファイルと対応しない「操作名」としてのMakeターゲット。
clean や all のようにファイルを生成するわけではない操作を表すターゲット名。宣言せずに同名のファイルが存在すると、makeが「最新なので実行不要」と誤判定してしまうことがある。.PHONYに列挙しておくことで、ファイルの有無に関わらず常にコマンドが実行される。
ブレークポイントぶれーくぽいんと
デバッガで、プログラムの実行を一時停止させる地点。
gdb の break コマンドで、行番号や関数名を指定して設定します。実行がその地点に達すると一時停止し、print で変数の値を見たり、next で1行ずつ進めたりして内部状態を調べられます。原因を絞り込むのに役立ち、調査が済んだら continue で実行を再開します。停止位置を有効にするには -g 付きでビルドしておく必要があります。
ヘッダファイルへっだふぁいる
関数や定数の宣言をまとめた、#include で取り込む .h ファイル。
stdio.h や math.h のように、関数の宣言・マクロ・型定義を記述したファイルです。前処理の段階で #include の行がヘッダの中身に置き換えられます。宣言だけを提供するもので、関数の実体はライブラリ側にあるため、使う関数によっては別途リンク(-lm など)が必要になります。
メタビルドツールめたびるどつーる
Makefile自体を環境に応じて生成する、ビルドツールより一段上の道具。CMakeなど。
自分でMakefileを直接書くのではなく、環境(コンパイラの種類やOS、利用可能なライブラリ)を検査したうえで、その環境向けのMakefileや相当するビルド設定ファイルを生成するツール。CMakeはCMakeLists.txtという設定ファイルから、環境に応じてMakefileやNinja向けファイルなど複数の形式を生成できる代表例。
位置独立コードいちどくりつこーど
-fPICで生成される、メモリ上のどのアドレスに配置されても動くオブジェクトコード。
共有ライブラリは複数のプロセスから読み込まれ、読み込まれるメモリアドレスが実行のたびに変わりうる。-fPIC(Position Independent Code)はアドレスを固定せずに動作できるコードを生成するコンパイルオプションで、共有ライブラリを作る前提のオブジェクトファイルには基本的に必須となる。
共有ライブラリきょうゆうらいぶらり
実行時に読み込まれる、複数プログラムで共用できるライブラリ(.so)。
Linuxでは拡張子 .so で表され、shared object の略です。実行ファイル本体には含めず、起動時に動的リンカが読み込みます。同じライブラリを多数のプログラムで共有できるためディスクとメモリを節約できます。依存関係は ldd で確認でき、見つからないと実行時エラーになります。対義は実行ファイルに埋め込む静的ライブラリ(.a)です。
自動変数じどうへんすう
Makeのルール内でターゲット名や依存名に自動的に置き換わる特殊な変数。$@ $< $^ など。
Makefileのルールを書くたびにファイル名を手で書き写す代わりに、makeが文脈から自動的に値を埋めてくれる変数。$@はターゲット名、$<は最初の依存ファイル、$^は依存ファイル全部に展開される。パターンルールと組み合わせることで、対象ファイルが増えてもルールを書き足さずに済む。
実行ファイルじっこうふぁいる
そのまま起動して動かせる、完成した機械語のプログラム。
リンクまで終えて生成される最終成果物で、Linuxでは ./名前 のようにパスを付けて起動します。gcc は出力名を省略すると a.out という名前で作り、-o オプションで任意の名前を指定できます。実行するにはファイルに実行権限(x)が必要です。
静的ライブラリせいてきらいぶらり
拡張子.a。arで複数の.oを束ね、リンク時に実行ファイルへコードごと取り込まれるライブラリ形式。
arコマンドでオブジェクトファイル群を1つのアーカイブにまとめたもの。リンクすると必要な部分が実行ファイルの中に直接コピーされるため、実行時に外部ファイルを探す必要がなく単体で動作できる。反面、同じライブラリを使う複数の実行ファイルがあると、それぞれにコードが重複して埋め込まれ、サイズが大きくなりやすい。

▶ 学習アプリで「引く」を使う