プログラミング

【プログラミング】gccの基本オプションの使い方

普段漫然と使っているgcc。そろそろちゃんと覚えたいと思い、基本オプションをそれぞれ試してみました。

この記事で解決できること

  • gccの基本的なオプションを知ることが出来る。

関連記事

【プログラミング】マルチコア環境における排他制御の課題

【プログラミング】gccの基本オプションの使い方

【C言語】デバッグのテクニック(標準関数のスタブ作成、動的ライブラリのデバッグ方法)

【プログラミング】迂回(Detours)という技術について

【プログラミング】64bit OSの32bitエミュレーションの状況

ひとりごと

かつて私がプログラマーになったばかりの頃。仕事ではSunのSolarisを使ってたのでコンパイラは商用のccを使ってました。家でもプログラミングを勉強したいと思いましたが商用UNIXを個人持ちするのは現実的ではありません。そこでLinux、FreeBSDに関心を持ちました。fips.exeていうDOSのパーティション分割ソフトでWindows98、Linux、FreeBSDをマルチブートさせ自宅に環境を作り夜な夜なプログラミング。現在は組み込みLinuxでプログラム開発をしているのでgccを当たり前のように使っています。そんなgccに初心に戻って触れてみたいと思います。

とにかくコンパイルして実行ファイルを作る

 command
$ 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

実行ファイルに名前をつける

 command
$ gcc -o test test.c

”test”という名前の実行ファイルが生成されました。

デバッグシンボル付き実行ファイルを生成する

 command
$ gcc ‐g -o test test.c

”test”という名前の実行ファイルにデバッグシンボルが付加されました。gdbなどでデバッグできます。

オブジェクトファイルのみ生成する

 command
$ gcc ‐c test.c

”test.o”というオブジェクトファイルが生成されます。

コンパイル時にワーニングを出すようにする

 command
$ gcc -Wall test.c

コンパイル時にワーニングが表示されるようになります。

最適化する

 command
$ gcc -O2  test.c

コンパイル時に最適化(Optimize)します。コードが小さくなったり、高速になったりするみたい。(今度詳しく調べてみます)。

O1:最適化する。

O2:さらに最適化する。

O0:最適化しない。

の3種類あるようです。

ライブラリをリンクする

 command
$ gcc -lxxx test.c

libxxx.aをリンクしたい場合、lib.aを除いたxxx-l(小文字のエル)のあとに指定します。

ライブラリパスを指定する

 command
$ gcc -L/hoge/moge -lxxx   test.c

標準のライブラリパス/usr/libなとではなく/hoge/moge/libxxx.aをリンクしたい場合、上記のように-L(大文字エル)の後にパスを指定します。スペースは開けません。

インクルードパスを指定する

 command
$ gcc -I/hoge/moge test.c

標準のインクルードパス/usr/includeなとではなく/hoge/moge/xxx.hをインクルードしたい場合、

#include  "/hoge/moge/xxx.h"

みたいにやっちゃいがちですが、-I(大文字アイ)の後にパスを指定することでユーザ定義のインクルードパスを追加でき、プログラムには以下のように書けます。環境依存を排除する観点からもお勧めです。

#include  <xxx.h>

こんな風にするのもあり。

 command
$ gcc -I/hoge test.c

#include  <moge/xxx.h>

余談ですが、こうするとソースファイルと同じディレクトリにあるヘッダを探します。

#include  "/xxx.h"

まとめ

普段漫然と使っているgcc。そろそろちゃんと覚えたいと思い、基本オプションをそれぞれ試してみました。

次回はもうちょっとマニアックなオプションの使い方をご紹介します。

 

関連記事

【プログラミング】マルチコア環境における排他制御の課題

【プログラミング】gccの基本オプションの使い方

【C言語】デバッグのテクニック(標準関数のスタブ作成、動的ライブラリのデバッグ方法)

【プログラミング】迂回(Detours)という技術について

【プログラミング】64bit OSの32bitエミュレーションの状況

  • この記事を書いた人
  • 最新記事

ペイヴメント

ペイヴメントのエンジニア塾(当ブログ)では20年以上の経験から得られたプログラミング系ノウハウについてベテランにも満足して頂けるような内容の濃いコンテンツを初心者にも分かりやすい形で日々発信しています。【経歴】ベンチャーのソフトハウスで4年勤務後、精密機器メーカーのソフト開発部門に勤務し今に至ります。

-プログラミング

Copyright© ペイヴメントのエンジニア塾 , 2020 All Rights Reserved.