普段漫然と使っているgcc。そろそろちゃんと覚えたい。

  • ひとりごと
かつて私がプログラマーになったばかりの頃。仕事ではSunのSolarisを使ってたのでコンパイラは商用のccを使ってました。家でもプログラミングを勉強したいと思いましたが商用UNIXを個人持ちするのは現実的ではありません。そこでLinux、FreeBSDに関心を持ちました。fips.exeていうDOSのパーティション分割ソフトでWindows98、Linux、FreeBSDをマルチブートさせ自宅に環境を作り夜な夜なプログラミング。現在は組み込みLinuxでプログラム開発をしているのでgccを当たり前のように使っています。そんなgccに初心に戻って触れてみたいと思います。
  • とにかくコンパイルして実行ファイルを作る。
$ gcc test.c
とやると”a.out”という実行ファイルが生成されます。readelfでヘッダを見るとこんな感じ。
$ readelf -h ./a.out
ELF ヘッダ:
  マジック:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  クラス:                            ELF64
  データ:                            2 の補数、リトルエンディアン
  バージョン:                        1 (current)
  OS/ABI:                            UNIX - System V
  ABI バージョン:                    0
  型:                                EXEC (実行可能ファイル)
  マシン:                            Advanced Micro Devices X86-64
  バージョン:                        0x1
  エントリポイントアドレス:               0x400440
  プログラムの開始ヘッダ:          64 (バイト)
  セクションヘッダ始点:          4512 (バイト)
  フラグ:                            0x0
  このヘッダのサイズ:                64 (バイト)
  プログラムヘッダサイズ:            56 (バイト)
  プログラムヘッダ数:                9
  セクションヘッダ:                  64 (バイト)
  セクションヘッダサイズ:            30
  セクションヘッダ文字列表索引:      27
  • 実行ファイルに名前をつける。
$ gcc -o test test.c
”test”という名前の実行ファイルが生成されました。
  • デバッグシンボル付き実行ファイルを生成する。
$ gcc ‐g -o test test.c
”test”という名前の実行ファイルにデバッグシンボルが付加されました。gdbなどでデバッグできます。
  • オブジェクトファイルのみ生成する。
$ gcc ‐c test.c
”test.o”というオブジェクトファイルが生成されます。
  • コンパイル時にワーニングを出すようにする。
$ gcc -Wall test.c
コンパイル時にワーニングが表示されるようになります。
  • 最適化する。
$ gcc -O2 test.c
コンパイル時に最適化(Optimize)します。コードが小さくなったり、高速になったりするみたい。(今度詳しく調べてみます)。

O1:最適化する。
O2:さらに最適化する。
O0:最適化しない。
の3種類あるようです。
  • ライブラリをリンクする。
$ gcc -lxxx test.c
【libxxx.a】をリンクしたい場合、【lib】と【.a】を除いたxxxを【-l】(小文字のエル)のあとに指定します。
  • ライブラリパスを指定する。
$ gcc -L/hoge/moge -lxxx   test.c
標準のライブラリパス【/usr/lib】なとではなく【/hoge/moge/libxxx.a】をリンクしたい場合、上記のように【-L】(大文字エル)の後にパスを指定します。スペースは開けません。
  • インクルードパスを指定する。
$ gcc -I/hoge/moge test.c
標準のインクルードパス【/usr/include】なとではなく【/hoge/moge/xxx.h】をインクルードしたい場合、
#include  "/hoge/moge/xxx.h"
みたいにやっちゃいがちですが、【-I】(大文字アイ)の後にパスを指定することでユーザ定義のインクルードパスを追加でき、プログラムには以下のように書けます。環境依存を排除する観点からもお勧めです。
#include  <xxx.h>
こんな風にするのもあり
$ gcc -I/hoge test.c
#include  <moge/xxx.h>
余談ですが、こうするとソースファイルと同じディレクトリにあるヘッダを探します。
#include  "/xxx.h"
IMG_20190315_203216

スポンサードリンク