CS107 GCC による C プログラムのコンパイル
Written by Chris Gregg, with modifications by Nick Troccoli
ウォークスルービデオはこちら
CS107で使用するコンパイラーは「GNU Compiler Collection」(gcc)と呼ばれるものです。
gcc
は、プログラムを構築するためにコンパイルのステップを実行し、次に、他のプログラムを呼び出してプログラムを組み立て、プログラムの構成要素をリンクして、実行可能なプログラムを作成します。 CS107 では、これらの各ステップについて少し学習しますが、gcc
が 1 つのコマンドで実行可能 (実行できる) プログラム全体を生成してくれるのが良いところです。
CS107 では、コードのコンパイル、アセンブル、リンクに主に Makefile を使用しますが、その作業を行うために Makefile は gcc
を実行するのです。 This is just a quick overview on how to compile and run your own programs should you decide to do so without a Makefile.
The simplest way to run gcc
is to provide gcc
a list of .c
files:
$ gcc hello.c$
Note that you do not put header files (.h
) into the gcc
command: it reads in the header files as it compiles, based on the #include
statements inside .c
files.
If the program compiled without errors or warnings, you don’t get any output from gcc
, and you will have a new file in your directory, called a.out
. To run this file, you need to tell the shell to run the file in the current directory, by using ./
before the name:
$ ./a.outHello, World!$
私たちは一般的に、プログラムに a.out
gcc
-o programName
オプションをつけて実行可能ファイルの名前を指定できます。
$ gcc hello.c -o hello$ ./helloHello, World!$
注意: 誤って入力ファイルと同じ実行可能ファイル名を入力しないように注意してください
$ gcc hello.c -o hello.c
myth
では、エラーが発生してもコンパイルしないよう設定されており、ソースファイルはそのままです。 他の多くの Linux システムではそうではないので、注意してください!
gcc
-O
(大文字の ‘o’) です。 gcc
には、さまざまな状況に応じてコードを最適化する機能があります。
- -O または -O1: 最適化します。 最適化コンパイルには多少時間がかかり、大きな関数の場合はメモリも多く必要になります。
-O
では、コンパイラーはコード サイズと実行時間を削減しようとし、コンパイルに多大な時間を要する最適化を実行しません。 - -O2: さらに最適化する。 GCC は空間速度のトレードオフを伴わない、サポートされているほぼすべての最適化を実行します。
-O
と比較して、このオプションはコンパイル時間と生成されたコードのパフォーマンスの両方を向上させます。 - -O3: さらに最適化する。
-O3
-O2
で指定したすべての最適化をオンにし、さらに他の最適化もオンにします。 これは多くの場合、最適なオプションとなります。 - -O0:コンパイル時間を短縮し、デバッグで期待通りの結果が得られるようにします。 これはデフォルトです。
- -Os。 サイズを最適化します。
-Os
-O2
最適化機能を有効にします。 また、コード サイズを減らすために設計されたさらなる最適化も実行します。 - -Ofast: 厳格な標準準拠を無視します。
-Ofast
-O3
最適化を有効にします。 また、すべての標準準拠のプログラムでは有効でない最適化も有効にします。 - -Og: デバッグのエクスペリエンスを最適化します。
-Og
は、デバッグを妨げないように最適化を行います。 これは、標準的な編集-コンパイル-デバッグのサイクルにおいて選択される最適化レベルであり、高速なコンパイルと良好なデバッグ体験を維持しながら、妥当なレベルの最適化を提供する必要があります。 CS107 では、デバッグ時に-Og
を使用します。
最適化の詳細については、gcc
のページを参照してください(または最適化に関する詳細はこちらを参照してください)。
もうひとつの共通のフラグは -std=gnu99
gcc
に “1999 c 標準の gnu c バージョン” を使用するように指定します。 この規格では、forループ宣言の中で変数を定義できるなどの構文が用意されています(例:for (int i = ...)
. CS107では、この規格を使用する予定です。
また、-g
フラグも使用します。これは、デバッガーである gdb を使用して、コードを実行するとその行番号を正確に教えてくれるようにするためのものです。
例:
$ gcc -std=gnu99 -g -Og loop.c -o loop
もし、gcc
に関するさらに詳しい情報に興味があれば、この Stanford Unix Programming Tools 文書のセクション 1 と gcc のマニュアル全体 (GNU) をチェックしてみてください
GNU のマニュアルは、以下のとおりです。