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.outgcc-o programName オプションをつけて実行可能ファイルの名前を指定できます。

$ gcc hello.c -o hello$ ./helloHello, World!$

注意: 誤って入力ファイルと同じ実行可能ファイル名を入力しないように注意してください

$ gcc hello.c -o hello.c

myth では、エラーが発生してもコンパイルしないよう設定されており、ソースファイルはそのままです。 他の多くの Linux システムではそうではないので、注意してください!

gcc-O (大文字の ‘o’) です。 gcc には、さまざまな状況に応じてコードを最適化する機能があります。

  1. -O または -O1: 最適化します。 最適化コンパイルには多少時間がかかり、大きな関数の場合はメモリも多く必要になります。 -O では、コンパイラーはコード サイズと実行時間を削減しようとし、コンパイルに多大な時間を要する最適化を実行しません。
  2. -O2: さらに最適化する。 GCC は空間速度のトレードオフを伴わない、サポートされているほぼすべての最適化を実行します。 -O と比較して、このオプションはコンパイル時間と生成されたコードのパフォーマンスの両方を向上させます。
  3. -O3: さらに最適化する。 -O3-O2 で指定したすべての最適化をオンにし、さらに他の最適化もオンにします。 これは多くの場合、最適なオプションとなります。
  4. -O0:コンパイル時間を短縮し、デバッグで期待通りの結果が得られるようにします。 これはデフォルトです。
  5. -Os。 サイズを最適化します。 -Os-O2 最適化機能を有効にします。 また、コード サイズを減らすために設計されたさらなる最適化も実行します。
  6. -Ofast: 厳格な標準準拠を無視します。 -Ofast-O3 最適化を有効にします。 また、すべての標準準拠のプログラムでは有効でない最適化も有効にします。
  7. -Og: デバッグのエクスペリエンスを最適化します。 -Og は、デバッグを妨げないように最適化を行います。 これは、標準的な編集-コンパイル-デバッグのサイクルにおいて選択される最適化レベルであり、高速なコンパイルと良好なデバッグ体験を維持しながら、妥当なレベルの最適化を提供する必要があります。 CS107 では、デバッグ時に -Og を使用します。

最適化の詳細については、gcc のページを参照してください(または最適化に関する詳細はこちらを参照してください)。

もうひとつの共通のフラグは -std=gnu99gcc に “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 のマニュアルは、以下のとおりです。