GCC ドライバーとツールチェーン

最終更新: 2021-06-21 17:17:24 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

gcc と g++ は GCC のドライバープログラムです。入力ファイルの拡張子とオプションに基づいて言語フロントエンドを選択し、前処理とコンパイルを実行して、アセンブラーを起動し、リンカーを制御します。正確なデフォルト設定は、構成されたターゲットと GCC のリリースによって異なるため、GCC マニュアルが正式な情報源です。

ドライバーの処理段階と言語のデフォルト #

ソースファイルに対するドライバーの処理は、前処理後(-E)、アセンブリへのコンパイル後(-S)、またはオブジェクトへのアセンブル後(-c)に停止できます。処理を停止するオプションがなければ、生成されたオブジェクトとライブラリをリンクします。

bash
g++ -std=c++20 -O2 -Wall -Wextra -c source.cc -o source.o
g++ source.o -o program

g++ は該当する入力に対して C++ としての処理を選択し、リンク時に C++ ランタイムライブラリを自動的に追加します。したがって、オブジェクトを個別にコンパイルした場合でも、C++ プログラムの最終リンクには g++ を使用してください。gcc は C 向けのドライバーです。-x c++ を渡すと入力言語は変わりますが、それだけでは g++ の C++ リンクに関するデフォルト設定は適用されません。

実行中のドライバーの動作を表示するには -v を使用します。ドライバーが実行する予定のコマンドを、実際には実行せずに表示するには -### を使用します。-print-prog-name=cc1plus、-print-search-dirs、-dumpspecs は、構成されたプログラム、検索パス、ドライバー仕様を公開します。これらは診断用であり、移植可能なビルドロジックに使用するものではありません。

依存関係と中間ファイル #

ヘッダーの依存関係をコンパイラーから生成します。

make
CPPFLAGS += -MMD -MP
OBJECTS := main.o parse.o

-include $(OBJECTS:.o=.d)

-MMD はシステムヘッダーを除外してユーザーヘッダーの依存関係を出力し、-MP は後で削除される可能性があるヘッダー用の phony ターゲットを追加します。依存関係ファイルを指定するには -MF を、そのターゲットを制御するには -MT または -MQ を使用します。処理段階を調査する必要がある場合、-save-temps は前処理とアセンブリの中間生成物を保持します。

リンク、Specs、検索パス #

ドライバーは仕様を展開し、スタートアップオブジェクト、libgcc、言語ランタイム、リンカーを選択するコマンドを生成します。-specs=file はこの展開を変更するツールチェーン構成の仕組みであり、一般的なプロジェクトオプションではありません。

-Bprefix は、下位プログラムと関連ファイルの検索プレフィックスを変更します。--sysroot=dir は、クロスツールチェーン用のターゲットヘッダーとライブラリの基準位置を変更します。-I はヘッダー検索に影響し、-L はライブラリディレクトリを追加し、-lname はライブラリを選択します。従来の静的アーカイブではリンク順序が重要であるため、アーカイブはそれを参照するオブジェクトの後に配置してください。リンカー固有のオプションは -Wl,option を介して渡し、ビルドシステムのターゲット構成はホストのデフォルト設定から分離してください。

診断と再現可能な呼び出し #

文書化された警告ポリシーを有効にしたうえで、サポート対象のコンパイラーにわたってプロジェクトが維持できる場合にのみ、選択した警告を -Werror= でエラーに昇格させてください。-g でデバッグ情報を追加します。最適化によってコード生成が変わり、未定義動作が顕在化する可能性があるため、最適化レベルは意図を持って使用してください。

GCC は構成された形式で機械可読な診断を出力できますが、その利用可否はリリースによって変わります。JSON、SARIF、色、またはパス形式の出力を CI の規約にする前に、gcc --help=common と、インストールされたバージョンに対応するマニュアルを確認してください。ドライバーの完全な呼び出し、コンパイラーのバージョン、ターゲットトリプル、関連する環境は、いずれも実際のツールチェーンに影響するため、失敗したビルドのログに保存してください。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)