gcc と g++ はそれぞれ GNU の C & C++ コンパイラです。gcc/g++ はコンパイルを実行する際、全部で4つのステップが必要です:
- 1、プリプロセス、.i ファイルを生成 [プリプロセッサ cpp]
- 2、プリプロセス済みファイルをアセンブリ言語に変換し、.s ファイルを生成 [コンパイラ egcs]
- 3、アセンブリからオブジェクトコード(マシンコード)に変換し、.o ファイルを生成 [アセンブラ as]
- 4、オブジェクトコードをリンクし、実行可能プログラムを生成 [リンカ ld]
パラメータ詳解
-x language filename
ファイルで使用する言語を指定し、拡張子を無効にして、以降の複数のファイルに対して有効にします。つまり、慣例により C 言語の拡張子は .c で、C++ の拡張子は .C または .cpp です。もしあなたが個性ので、C コードファイルの拡張子を .pig にすると決めたなら(笑)、このパラメータを使う必要があります。このパラメータは、その後のファイル名すべてに影響します。次のパラメータが使用されるまでです。使用できるパラメータは以下のとおりです。'c', 'objective-c', 'c-header', 'c++', 'cpp-output', 'assembler', および 'assembler-with-cpp'。
英語を見れば理解できるでしょう。
使用例:
gcc -x c hello.pig
-x none filename
前のオプションをオフにし、gcc がファイル名の拡張子に基づいてファイルタイプを自動認識するようにします。
使用例:
gcc -x c hello.pig -x none hello2.c
-c
プリプロセス、コンパイル、アセンブルのみを有効にします。つまり、プログラムをオブジェクトファイルにするだけです。
使用例:
gcc -c hello.c
これは .o のオブジェクトファイルを生成します。
-S
プリプロセスとコンパイルのみを有効にします。つまり、ファイルをアセンブリコードにコンパイルします。
使用例:
gcc -S hello.c
これは .s のアセンブリコードを生成します。テキストエディタで確認できます。
-E
プリプロセスのみを有効にしますが、これはファイルを生成しないため、出力ファイルにリダイレクトする必要があります。
使用例:
gcc -E hello.c > pianoapan.txt gcc -E hello.c | more
ゆっくり見てください。hello world でも 800 行のコードにプリプロセスされます。
-o
ターゲット名を指定します。デフォルトでは、gcc がコンパイルして生成するファイルは a.out で、聞こえが悪いです。もしあなたも同じ感想なら、変更しましょう(笑)。
使用例:
gcc -o hello.exe hello.c (哦,windows用习惯了) gcc -o hello.asm -S hello.c
-pipe
コンパイル中の一時ファイルの代わりにパイプを使用します。GNU 以外のアセンブラツールを使用する場合、問題が発生する可能性があります。
gcc -pipe -o hello.exe hello.c
-ansi
GNU C の ANSI C と互換性のない機能を無効にし、ANSI C の独自機能を有効にします(asm、inline、typeof キーワードの禁止、および UNIX、vax などのプリプロセスマクロを含む)。-fno-asm
このオプションは ansi オプションの機能の一部を実装し、asm、inline、typeof をキーワードとして使用することを禁止します。
-fno-strict-prototype
このオプションは g++ にのみ有効です。このオプションを使用すると、g++ は引数なしの関数を、引数の数と型の明示的な指定がない関数と見なします(引数がないとは見なしません)。
一方、gcc はこのパラメータを使用するかどうかに関係なく、引数なしの関数を、引数の型が明示されていないものと見なします。
-fthis-is-varialble
伝統的な C++ に合わせるもので、this を通常の変数として使用できます。
-fcond-mismatch
条件式の第2および第3オペランドの型が一致しなくても許可され、式の値は void 型になります。
-funsigned-char 、-fno-signed-char、-fsigned-char 、-fno-unsigned-char
これら4つのパラメータは char 型を設定するもので、char 型を unsigned char(最初の2つのパラメータ)または signed char(後の2つのパラメータ)に設定します。
-include file
特定のコードを含める、簡単に言うと、あるファイルをコンパイルするときに別のファイルが必要な場合にそれを設定できます。機能はコード内で使用するのと同等です。#include<filename>。
使用例:
gcc hello.c -include /root/pianopan.h
-imacros file
file というファイルのマクロを gcc/g++ の入力ファイルに展開します。マクロ定義自体は入力ファイルには現れません。
-Dmacro
C 言語の...に相当します。#define macro
-Dmacro=defn
C 言語の...に相当します。#define macro=defn
-Umacro
C 言語の...に相当します。#undef macro
-undef
非標準マクロの定義をすべて取り消します。
-Idir
使用するとき、 #include "file"gcc/g++ はまず現在のディレクトリで指定したヘッダファイルを探します。見つからない場合は、デフォルトのヘッダファイルディレクトリに戻って探します。-I でディレクトリを指定した場合は、まず指定したディレクトリで探し、その後通常の順序で探します。
#include<file> の場合、gcc/g++ は -I で指定したディレクトリを検索し、見つからない場合は、システムのデフォルトのヘッダファイルディレクトリを検索します。
-I-
前のパラメータの機能をキャンセルするもので、通常は -Idir の後に使用します。
-idirafter dir
-I のディレクトリ内で検索に失敗した場合、このディレクトリ内も検索します。
-iprefix prefix 、-iwithprefix dir
通常は一緒に使用します。-I のディレクトリで検索に失敗した場合、prefix+dir の下を検索します。
-nostdinc
コンパイラにシステムデフォルトのヘッダファイルディレクトリ内でヘッダファイルを探させないようにします。通常は -I と組み合わせて使用し、ヘッダファイルの位置を明確に限定します。
-nostdin C++
g++ が指定する標準パスでは検索しないことを指定しますが、他のパスでは検索します。このオプションは libg++ ライブラリを作成するときに使用します。
-C
プリプロセス時にコメント情報を削除しません。通常は -E と一緒に使用します。プログラムを解析する際には、これを使うととても便利です。
-M
ファイルの依存関係情報を生成します。ターゲットファイルが依存するすべてのソースコードを含みます。あなたはこれを使うことができます。gcc -M hello.c試してみてください。とても簡単です。
-MM
上記のものと同じですが、... による依存関係を無視します。#include<file>引き起こされる依存関係。
-MD
-M と同じですが、出力は .d ファイルに出力されます。
-MMD
-MM と同じですが、出力は .d ファイルに出力されます。
-Wa,option
このオプションは option をアセンブラに渡します。option の中にカンマがある場合、option を複数のオプションに分割してアセンブラに渡します。
-Wl.option
このオプションは option をリンカに渡します。option の中にカンマがある場合、option を複数のオプションに分割してリンカに渡します。
-llibrary
コンパイル時に使用するライブラリを指定します。
使用例
gcc -lcurses hello.c
ncurses ライブラリを使用してプログラムをコンパイルします。
-Ldir
コンパイル時にライブラリを検索するパスを指定します。例えば、自分自身のライブラリがある場合、これを使ってディレクトリを指定できます。そうしないと、コンパイラは標準ライブラリのディレクトリだけを探します。この dir がディレクトリ名です。
-O0 、-O1 、-O2 、-O3
コンパイラの最適化オプションには4つのレベルがあります。-O0 は最適化なし、-O1 はデフォルト値、-O3 は最適化レベルが最高です。
-g
コンパイラに、コンパイル時にデバッグ情報を生成させます。
-gstabs
このオプションは stabs 形式でデバッグ情報を生成しますが、gdb デバッグ情報は含みません。
-gstabs+
このオプションは stabs 形式でデバッグ情報を生成し、gdb 専用の追加デバッグ情報を含みます。
-ggdb
このオプションは、可能な限り gdb で使用できるデバッグ情報を生成します。
-static
このオプションはダイナミックライブラリの使用を禁止します。そのため、コンパイルされたものは一般的に大きく、ダイナミックリンクライブラリを必要とせずに実行できます。
-share
このオプションは可能な限りダイナミックライブラリを使用するため、生成ファイルは比較的小さくなりますが、システムにダイナミックライブラリが必要です。
-traditional
コンパイラに伝統的な C 言語の機能をサポートさせようとします。
GCC は GNU の C および C++ コンパイラです。実際、GCC は C、C++、Object C(C 言語のオブジェクト指向拡張)の3つの言語をコンパイルできます。gcc コマンドを使用すると、C および C++ ソースプログラムを同時にコンパイルおよびリンクできます。
2つか少数の C ソースファイルがある場合も、GCC を使用して簡単にコンパイル、リンクし、実行可能ファイルを生成できます。例えば、main.c と factorial.c の2つのソースファイルがあり、階乗を計算するプログラムをコンパイルして生成するとします。
factorial.c ファイルのコード
main.c ファイルのコード
次のコマンドを使用すると、実行可能ファイルをコンパイル生成し、プログラムを実行できます:
$ gcc -o factorial main.c factorial.c $ ./factorial 5 Factorial of 5 is 120.
GCC は C プログラムと C++ プログラムの両方をコンパイルするために使用できます。一般に、C コンパイラはソースファイルの拡張子に基づいて C プログラムか C++ プログラムかを判断します。Linux では、C ソースファイルの拡張子は .c、C++ ソースファイルの拡張子は .C または .cpp です。ただし、gcc コマンドは C++ ソースファイルをコンパイルできますが、C++ プログラムが使用するライブラリと自動的にリンクすることはできません。そのため、通常は g++ コマンドを使用して C++ プログラムのコンパイルとリンクを行います。このコマンドは自動的に gcc を呼び出してコンパイルを実行します。次のような C++ ソースファイル(hello.c)があるとします。
hello.c ファイルのコード
次のように g++ コマンドを呼び出して、コンパイル、リンクし、実行可能ファイルを生成できます:
$ g++ -o hello hello.c $ ./hello Hello, world!
gcc コマンドのよく使われるオプション
| オプション | 説明 |
|---|---|
| -ansi | ANSI 標準の C 構文のみをサポートします。このオプションは、GNU C の特定の機能(たとえば asm や typeof キーワード)を禁止します。 |
| -c | コンパイルのみ行い、オブジェクトファイルを生成する。 |
| -DMACRO | 文字列"1"で MACRO マクロを定義する。 |
| -DMACRO=DEFN | 文字列"DEFN"で MACRO マクロを定義する。 |
| -E | C プリプロセッサのみ実行する。 |
| -g | デバッグ情報を生成する。GNU デバッガはこの情報を利用できる。 |
| -IDIRECTORY | 追加のヘッダファイル検索パス DIRECTORY を指定する。 |
| -LDIRECTORY | 追加の関数ライブラリ検索パス DIRECTORY を指定する。 |
| -lLIBRARY | リンク時に指定された関数ライブラリ LIBRARY を検索する。 |
| -m486 | 486 向けにコードを最適化する。 |
| -o FILE | 指定された出力ファイルを生成する。実行ファイルの生成時に使用する。 |
| -O0 | 最適化処理を行わない。 |
| -O または -O1 | 生成コードを最適化する。 |
| -O2 | さらに最適化する。 |
| -O3 | -O2 よりもさらに最適化する。inline 関数を含む。 |
| -shared | 共有オブジェクトファイルを生成する。通常、共有ライブラリの作成時に使用する。 |
| -static | 共有リンクの使用を禁止する。 |
| -UMACRO | MACRO マクロの定義を取り消す。 |
| -w | 警告情報を一切生成しない。 |
| -Wall | すべての警告情報を生成する。 |