gcc

GNU Compiler Collection (GCC) とは、C言語C++ 及び Objective-C のコンパイラである。フリーソフトウェアであり、LinuxMicrosoft Windows などさまざまなプラットフォームで使用できる。

gccコマンド

LinuxでC言語のソースファイルをコンパイルする場合、gccコマンドを使用するのが一般的である。

gcc [options] path

オプション

gccには次のオプションを指定できる。

-c
実行可能ファイルではなく、オブジェクトファイル(*.o)を作成する。つまり、コンパイルだけ行い、リンクは行わない。
$ gcc -c example.c
-fPIC
Linux で共有ライブラリ(*.so)を作成する場合、-fPIC (Position Independant Code) オプションを指定する。
$ gcc -fPIC -shared example.c -o libexample.so

共有ライブラリとリンクした実行可能ファイルを実行するには、あらかじめ環境変数 LD_LIBRARY_PATH に共有ライブラリを配置したディレクトリのパスを設定しておく必要がある。

環境変数 LD_LIBRARY_PATH にパスを設定していないと、実行可能ファイルを実行した際に以下のエラーが出力される。

$ ./samplelmf
./samplelmf: error while loading shared libraries: libsample.so: cannot open shared object file: No such file or directory

-fsigned-char
singed 及び unsigned で修飾されていない char を singed char と解釈する。
$ gcc -fsigned-char example.c
-funsigned-char
singed 及び unsigned で修飾されていない char を unsigned char と解釈する。
$ gcc -funsigned-char example.c
--help
ヘルプ情報を表示する。
-I directory
ヘッダファイル(インクルードファイル)を探すディレクトリを指定する。
$ gcc -I /home/tsuka/include example.c
-o file

出力するファイル名をfileとする。-oオプションを省略した場合、a.outというファイル名で作成する。

$ gcc -o example example.c
-shared

共有オブジェクト(*.so)を作成する。

--version
バージョンを表示して、コマンドを終了する。
$ gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

プリプロセッサオプション

以下のgccオプションは、プリプロセッサに関するオプションである。

-D name
name を値1のマクロとして定義する。
$ gcc -D DEBUG example.c
-D name=definition
name を指定した値でマクロとして定義する。
$ gcc -D BUFSIZE=256 example.c
-E
プリプロセッサを実行して、コンパイルを行わずに終了する。プリプロセスの結果は、標準出力へ送信される。
$ gcc -E example.c
-include file
通常の入力ファイルが処理される前にfileを処理する。file に含まれる内容は、一番最初にコンパイルされる。
-imacros file
通常の入力ファイルが処理される前に file を処理するが、その結果の出力を捨てる。file によって生成された出力は捨てられるため、「-include file」の処理結果の影響は、file内に記述されたマクロが入力ファイル内で使用可能になることだけである。gccの-imacrosオプションを使用する例として、ソースプログラムhelloworld.cの内容を次に示す。
#include <stdio.h>

main() {
  printf("%s\n", HELLO_WORLD);
}

マクロを定義したファイルhelloworld.hの内容を次に示す。

#define HELLO_WORLD "Hello, world!"

ソースプログラムの中で#include "helloworld.h"を記述してインクルードすることもできるが、gccの-imacrosオプションを指定してコンパイルすることもできる。

$ gcc -imacros helloworld.h helloworld.c

デバッグオプション

次のgccオプションは、デバッグに関するオプションである。

-g
OSのネイティブのフォーマットでデバッグ情報を生成する。GDBはこのデバッグ情報に基づいて動作することができる。

コンパイル

gccでコンパイルする例を示す。

実行ファイルのコンパイル

C言語のソースプログラムをコンパイルする。

$ gcc example.c

静的ライブラリのコンパイル

Linuxで静的ライブラリ(*.a)を作成する。

$ gcc -c example.c
$ ar rv libexample.a example.o

gccのインストール

UbuntuやDebianなど、debパッケージ管理システムのLinuxの場合、aptコマンドでgccをインストールする。

gccのインストールにはスーパーユーザ権限が必要なので、sudoコマンドでaptを実行する。

$ sudo apt install gcc
[sudo] password for marina:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libfreetype6
Use 'sudo apt autoremove' to remove it.
The following additional packages will be installed:
binutils binutils-common binutils-x86-64-linux-gnu cpp cpp-7 gcc-7 gcc-7-base libasan4 libatomic1 libbinutils
libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libgcc-7-dev libgomp1 libisl19 libitm1 liblsan0 libmpc3 libmpx2
libquadmath0 libtsan0 libubsan0 linux-libc-dev manpages-dev
Suggested packages:
binutils-doc cpp-doc gcc-7-locales gcc-multilib make autoconf automake libtool flex bison gdb gcc-doc gcc-7-multilib
gcc-7-doc libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan4-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg
libcilkrts5-dbg libmpx2-dbg libquadmath0-dbg glibc-doc
The following NEW packages will be installed:
binutils binutils-common binutils-x86-64-linux-gnu cpp cpp-7 gcc gcc-7 gcc-7-base libasan4 libatomic1 libbinutils
libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libgcc-7-dev libgomp1 libisl19 libitm1 liblsan0 libmpc3 libmpx2
libquadmath0 libtsan0 libubsan0 linux-libc-dev manpages-dev
0 upgraded, 27 newly installed, 0 to remove and 0 not upgraded.
Need to get 26.9 MB of archives.
After this operation, 115 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Setting up libcc1-0:amd64 (8-20180414-1ubuntu2) ...
Setting up libtsan0:amd64 (8-20180414-1ubuntu2) ...
Setting up linux-libc-dev:amd64 (4.15.0-20.21) ...
Setting up liblsan0:amd64 (8-20180414-1ubuntu2) ...
Setting up gcc-7-base:amd64 (7.3.0-16ubuntu3) ...
Setting up binutils-common:amd64 (2.30-15ubuntu1) ...
Setting up libmpx2:amd64 (8-20180414-1ubuntu2) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Processing triggers for man-db (2.8.3-2) ...
Setting up libmpc3:amd64 (1.1.0-1) ...
Setting up libc-dev-bin (2.27-3ubuntu1) ...
Setting up manpages-dev (4.15-1) ...
Setting up libc6-dev:amd64 (2.27-3ubuntu1) ...
Setting up libitm1:amd64 (8-20180414-1ubuntu2) ...
Setting up libisl19:amd64 (0.19-1) ...
Setting up libasan4:amd64 (7.3.0-16ubuntu3) ...
Setting up libbinutils:amd64 (2.30-15ubuntu1) ...
Setting up libcilkrts5:amd64 (7.3.0-16ubuntu3) ...
Setting up libubsan0:amd64 (7.3.0-16ubuntu3) ...
Setting up libgcc-7-dev:amd64 (7.3.0-16ubuntu3) ...
Setting up cpp-7 (7.3.0-16ubuntu3) ...
Setting up binutils-x86-64-linux-gnu (2.30-15ubuntu1) ...
Setting up cpp (4:7.3.0-3ubuntu2) ...
Setting up binutils (2.30-15ubuntu1) ...
Setting up gcc-7 (7.3.0-16ubuntu3) ...
Setting up gcc (4:7.3.0-3ubuntu2) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
$

参考文献

Free Software Foundation, Inc. (2022) GCC, the GNU Compiler Collection