次は出力の種類の制御オプションについて説明します.
コンパイルの過程は,四つの段階に分けることができます.プリプロセス,コンパイル,アセンブル,リンクです.
前の三つの段階は個々のソースファイルに対して適用され,オブジェクトファイルの生成で終わります.リンクでは,すべてのオブジェクトファイルを組み合わせて,一つの実行形式ファイルを作ります.
指定された入力ファイルそれぞれに拡張子からコンパイル過程のどれが実行されるかが決定されます.
以下のような対応になります.
● hogehoge.c
Cソースファイルです.これはプリプロセスが必要です.
プリプロセスは#include <stdio.h>,#defineなどのコンパイルの前処理です.必要としない場合もあるので,意識しておきましょう.
● hogehoge.i
Cソースファイルです.これはプリプロセスを必要としません.
● hogehoge.ii
C++ソースファイルです.これはプリプロセスを必要としません.
今回はC++のことには言及しません.次回以降に説明します.
● hogehoge.m
Objective-Cのソースファイルです.Objective-Cのプログラムとして動作させるには,ライブラリlibobjc.aをリンクする必要があることに注意してください.
今回はObjective-Cのことには言及しません.
● hogehoge.h
Cのヘッダファイルとして扱われます.
● hogehoge.cc,hogehoge.cxx,hogehoge.cpp,hogehoge.C
C++のソースファイルです.これはプリプロセスが必要です.cxxの最後の二文字は字面どおりxでなければなりません.同じく,.Cは大文字のCです.
筆者の感覚では,C++のソースファイル名はcppと決めたほうが混乱がなくて良いと思います.
● hogehoge.s
アセンブラソースファイルとして扱われます.
GCCはCソースをアセンブラコードに変換し,それを実行形式ファイルにします.
アセンブラを理解できなくても,おおよそのことが理解できると,GCCがバグを吐くこともあるので,仕事がはかどります.
● hogehoge.S
アセンブラソースファイルです.これはプリプロセスが必要です.
オブジェクトファイルは,そのままリンクフェーズに渡されます.認識できない拡張子を持たないファイル名も同じように扱われます.
指定された入力ファイルそれぞれに拡張子からコンパイル過程のどれが実行されるかが決定されます.その際,-xオプションを指定することで入力の言語を明示的に指定できます.
● -x language
後続の入力ファイルの言語を,明示的にlanguageと指定するこのオプションは,次に-xオプションが現れるまでの入力ファイルに対して適用されます.languageに指定できる値は,次のとおりです.
c objective-c c++
c-header cpp-output c++-cpp-output
assembler assembler-with-cpp
● -x none
言語を明示的に指定するのを取り止めます.これ以降のファイルは,ファイル名の拡張子にしたがって処理されます.
コンパイル過程の一部分だけ実行したい場合は,-xを使って開始する段階を指定することができます.どの段階で終了するかは,オプション-c,-S,-Eのどれか一つを使って指定することができます.
● -c
ソースファイルのコンパイルやアセンブルは行うが,リンクは行いません.単にリンク段階を行わないのです.この場合の最終的な出力は,各ソースファイルごとのオブジェクトファイルという形になります.
デフォルトでは,オブジェクトファイル名は,ソースファイル名の拡張子.c,.i,.sなどを.oに置き換えたものになります.
● -S
コンパイル本体の段階で終了します.アセンブルは行いません.出力はアセンブラコードファイル形式となります.
デフォルトでは,アセンブラファイル名は,ソースファイル名の拡張子.c,.iなどを.sに置き換えたものになります.
コンパイルを必要としない入力ファイルは無視されます.
● -E
プリプロセス段階で終了します.コンパイラ本体は実行しません.出力はプリプロセスされたソースコードの形式で,標準出力に出力されます.そのソースを捨てたくなかったらリダイレクトする必要があります.
プリプロセスを必要としない入力ファイルは無視されます.
● -o file
出力を指定されたファイルfileに置きます.これは,生成される出力の種類に依存しません.
出力ファイルは一つしか指定できないので,複数の入力ファイルがある場合に-oを指定するのは,実行形式ファイルを出力とする場合しか意味がありません.
-oの指定がない場合,実行形式ファイルはa.outという名前で,source.suffixというソースファイルのオブジェクトファイルはsource.oという名前で,アセンブラファイルはsource.sという名前で作られ,プリプロセスした C のソースは標準出力に出力されることになります.
● -v
コンパイルの各段階で実行されるコマンドを標準エラー出力に表示します.また,コンパイラドライバプログラム,プリプロセッサ,コンパイラ本体のバージョン番号も合わせて表示します.
● -pipe
コンパイルの各段階間での情報の受け渡しに,一時ファイルではなく,パイプを使います.これはアセンブラがパイプからの読み出しができないシステムでは動作しません.GCCがインストールされていれば,GNUアセンブラを使用するので問題ありません.
● --help
gccが理解するコマンド行オプションの説明を標準出力に表示します.あわせて-vオプションも指定すると,--helpはgccが起動するいろいろなプロセスにも渡されます.渡されたプロセスは受け付け可能なコマンド行オプションを表示することができるようになります.-Wオプションを一緒に指定すると,説明が用意されていないコマンド行オプションも表示されます.
次回はGCCでC言語を使う場合の,ほかのさまざまなオプションについて,説明と検証を行います.
|