OSS開発ツール/コンパイラ

コンパイラ編集

ウィキペディアGNUコンパイラコレクションの記事があります。

GCCは GNU Compiler Collection の略でいくつかの言語のコンパイラおよび逆コンパイラ(たとえばndisasm)など関連ツールが附属しています。言語のコンパイラがフリーで手に入るのは非常に重要な事で、全てのオープンソースの基礎となったといえるプログラムです。歴史について詳しくは、w:gccを参照して下さい。

普通のgccはC言語が標準ですが、関連ツーとしてCPlusPlusFortran及び、Java版のgccも用意されており無料で入手できます。ただし、Javaについては標準ライブラリのサポートが完全でないので、使いづらい面が残ります。(gcj-3.4.4のinfoファイルより)

「g++」とはC++版のgccのことです。


使用例編集

$gcc aaa.c -o aaa

上記のコマンドは、「aaa.c」という名前のソースコードファイルを、別ファイルの「aaa」という名前で新規にオブジェクトファイルを作成しています。

「-o」は、「オブジェクトファイルを次の名前で出力せよ」というような意味の引数です。ファイル名などとの区別のため、「-」と引数の冒頭にハイフン(直接入力)をつけます。

ソースコード自体は、『メモ帳』などテキストエディタで作成します。Linuxの場合なら『Gedit』などのテキストエディタで記述します。GCCでは、ソースコード自体は記述できないです。


ソースファイルと出力ファイルの名前は、べつに同じでなくてもかまいません。

たとえば、

$gcc aaa.c –o bcd

でもファイル名「bcd」でオブジェクトファイルが作成されます。

なお、作成した「bcd」を実行したい場合、もしホームフォルダに作成されたなら、

[ユーザー名@localhost ~]$ ./bcd

のように、「./」の後ろにファイル名を入れたコマンドをエンターすれば、オブジェクトファイル「bcd」を実行できます。

「./」とは、ホームフォルダのことです。ホームフォルダ以外の場所で作業している場合は、適宜、それに合わせてコマンドを変えてください(※ 説明は省略。一般的なUnix/Linuxの本に書いてあるので省略)。

また、そもそも拡張子(なんらかのファイルのファイル名の後ろにつく「.txt」 や 「.doc」 など)はLinuxやUnixなどでは、一部のファイル形式(「.c」)を除くと不要です。すべてのファイル形式で拡張子を使うのは、Windows特有の文化です。

ただしCのソースファイルの場合、Windows版gcc(MinGW)の場合でも、Linuxの場合でも、ソースファイルには末尾に拡張子.cをつける必要があります(.cをつけずにソースコードを作成してコンパイルしてもエラーになることを確認ずみ(2019年11月30日))。これはおそらく、コンパイラにプログラム言語の種類を認識するためでしょう。

MinGWでも、(ソースファイルでなく)オブジェクトファイルの拡張子は省略できます。

Linuxでも、Cのソースファイルをコンパイルする場合には拡張子.cをつけなければならない(Fedora 31 で確認ずみ)。

Linuxで、たとえば「aaa.c」の代わりに

[ユーザー名@localhost ~]$ gcc aaa

と入れても

aaa: file not recognized: file format not recognized
collect2: エラー: ld はステータス 1 で終了しました

とターミナル(コマンド端末のこと)から文句を言われて中断してしまう。


ただし、ソースファイル以外なら、拡張子なしでも可能な場合がある。

また、このように拡張子なしで判断することもあってか、コマンドの語順の順番が重要です。

$gcc ソースコード側のファイル名 -o 出力側のファイル名 

のような順番になります。

あるいは言い換えるなら

$gcc インプット側のファイル名 -o アウトプット側のファイル名 

とも言えましょうか。


もし、 $gcc aaa.c bcd -o(×: ダメな例) または $gcc bcd -o aaa.c (×: ダメな例) の語順でコマンド入力してエンターしても、エラーになります。

実際、Fedora31の場合、

[ユーザー名@localhost ~]$ gcc aaa.c bcd -o
gcc: エラー: bcd: そのようなファイルやディレクトリはありません
gcc: エラー: ‘-o’ の後にファイル名がありません

と警告を言われて中断します。


なお、

  $gcc  -o  bcd aaa.c 

はコンパイル可能です。(Windows7でもLinux(Fedora31で確認ずみ)でもコンパイル可能)

つまり、 -oの直後に出力ファイル名が来るようすれば、とりあえずコンパイルできるでしょう。


GCCのヘルプが見たいなら、

$gcc --help

などでヘルプが見られます。GCCには、上記ヘルプで紹介される以外にも様々な機能や引数があります。


引数編集

gccでよく使われるオプションとして -I, -L, -l, -c, -o などがあります。

-I はインクルードするヘッダファイルを探すディレクトリを指定します。
-L はリンクを行なうライブラリファイルのディレクトリを指定します。
-l は実際にリンクするファイルの名前を指定します。静的ライブラリの名前はlibxxx.aとなっているので、ファイルを指定するときには-lxxxの形で指定します。
-c は実行ファイルを作成する時点でコンパイルを終え、リンクを行なわないことを指定します。このオプションはmain関数を含まないソースファイルからオブジェクトファイルを作るために使います。
-o は出力するファイル名を指定します。なお -o が無いと「a.out」またはWindows版MinGWなら「a.exe」のような名前でオブジェクトファイルが作成されます。
このページ「OSS開発ツール/コンパイラ」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。