gccgccを使い始める


備考

GCC(大文字)はGNUコンパイラ・コレクションを指します。これは、C、C ++、Objective C、Fortran、Ada、Go、Java用のコンパイラを含むオープンソースコンパイラスイートです。 gcc(小文字)は、GNU Compiler CollectionのCコンパイラです。歴史的にGCCとgccは同じ意味で使用されていますが、GCCにはCよりも多くをコンパイルするツールが含まれているため、2つの用語を分ける努力がなされています。

このセクションのドキュメントは、GNU Cコンパイラのgccを参照します。その目的は、一般的なアクションとオプションのクイックルックアップを提供することです。 GCCプロジェクトにはhttps://gcc.gnu.orgの詳細なドキュメントがあり、インストール、一般的な使用法、およびすべてのコマンドラインオプションについて説明しています。ここで答えられていない質問については、公式GCCのドキュメントを参照してください。特定のトピックがGCCドキュメントで不明な場合は、具体的な例をリクエストしてください。

バージョン

バージョン発売日
7.1 2017-05-02
6.3 2016年12月21日
6.2 2016-08-22
5.4 2016年06月03日
6.1 2016-04-27
5.3 2015-12-04
5.2 2015-07-16
5.1 2015-04-22
4.9 2014-04-22
4.8 2013-03-22
4.7 2012-03-22
4.6 2011-03-25
4.5 2010-04-14
4.4 2009-04-21
4.3 2008-03-05
4.2 2007-05-13
4.1 2006-02-28
4.0 2005-04-20
3.4 2004-04-18
3.3 2003-05-13
3.2 2002-08-14
3.1 2002-05-15
3.0 2001年06月18日
2.95 1999年7月31日
2.8 1998年1月1日
2.7 1995-06-16
2.6 1994-07-14
2.5 1993-10-22
2.4 1993-05-17
2.3 1992-10-31
2.2 1992-06-08
2.1 1992-03-24
2.0 1992-02-22
1.42 1992-09-20
1.41 1992-07-13
1.40 1991-06-01
1.39 1991-01-16
1.38 1990-12-21
1.37 1990-02-11
1.36 1989-09-24
1.35 1989-04-26
1.34 1989-02-23
1.33 1989-02-01
1.32 1988年12月21日
1.31 1988年11月19日
1.30 1988-10-13
1.29 1988年10月6日
1.28 1988-09-14
1.27 1988-09-05
1.26 1988-08-18
1.25 1988-08-03
1.24 1988年7月2日
1.23 1988-06-26
1.22 1988-05-22
1.21 1988-05-01
1.20 1988-04-19
1.19 1988-03-29
1.18 1988-02-04
1.17 1988年1月9日
1.16 1987年12月19日
1.15 1987-11-28
1.14 1987-11-06
1.13 1987-10-12
1.12 1987-10-03
1.11 1987-09-05
1.10 1987-08-22
1.9 1987-08-18
1.8 1987-08-10
1.7 1987-07-21
1.6 1987-07-02
1.5 1987年06月18日
1.4 1987年06月13日
1.3 1987年6月10日
1.2 1987-06-01
1.1 1987-05-24
1.0 1987-05-23
0.9 1987-03-22

"こんにちは世界!"一般的なコマンドラインオプション

単一のソースファイルを持つプログラムの場合、gccを使用するのは簡単です。

/* File name is hello_world.c */
#include <stdio.h>

int main(void)
{
    int i;
    printf("Hello world!\n");
}
 

コマンドラインからhello_world.cファイルをコンパイルするには:

gcc hello_world.c
 

gccはプログラムをコンパイルし、実行可能ファイルをa.outファイルに出力します。実行可能ファイルに名前を付ける場合は、-oオプションを使用します。

gcc hello_world.c -o hello_world
 

実行可能ファイルは、a.outの代わりにhello_worldという名前になります。デフォルトでは、gccによって放出される多くの警告はありません。 gccには多くの警告オプションがあります。gccのドキュメントを参照して入手可能な情報を調べることをお勧めします。 '-Wall'を使うことは良い出発点であり、多くの一般的な問題をカバーします。

gcc -Wall hello_world.c -o hello_world
 

出力:

hello_world.c: In function ‘main’:
hello_world.c:6:9: warning: unused variable ‘i’ [-Wunused-variable]
     int i;
         ^
 

ここで、変数 'i'は宣言されているが、関数内ではまったく使用されていないという警告が表示されることがわかります。

プログラムのテストにデバッガを使用する予定の場合は、デバッグ情報を含めるようにgccに指示する必要があります。デバッグサポートには '-g'オプションを使用してください。

gcc -Wall -g hello_world.c -o hello_world
 

hello_worldはGDBでサポートされているデバッグ情報を持つようになりました。別のデバッガを使用している場合、異なるデバッグオプションを使用して、出力が正しくフォーマットされている必要があります。詳細なデバッグオプションについては、公式のgccのドキュメントを参照してください。

デフォルトでは、gccはデバッグしやすいようにコードをコンパイルします。 gccは、最終的な実行可能ファイルが同じ結果を生成するように出力を最適化することができますが、パフォーマンスは向上し、実行可能ファイルのサイズが小さくなります。 '-O'オプションは最適化を有効にします。最適化レベルを指定するためにOの後に追加する修飾子がいくつかあります。各最適化レベルは、コマンドラインオプションのセットリストを追加または削除します。 '-O2'、 '-Os'、 '-O0'、 '-Og'は最も一般的な最適化レベルです。

gcc -Wall -O2 hello_world.c -o hello_world
 

'-O2'は、生産準備完了コードの最も一般的な最適化レベルです。これは、パフォーマンスの向上と最終的な実行可能なサイズのバランスが優れています。

gcc -Wall -Os hello_world.c -o hello_world
 

'-Os'は '-O2'と似ていますが、実行可能ファイルのサイズを増やして実行速度を向上させる最適化が無効になっている点が異なります。最終的な実行ファイルのサイズが問題になる場合は、 '-Os'を試して、最終実行ファイルに目立つサイズの違いがあるかどうかを確認してください。

gcc -Wall -g -Og hello_world.c -o -hello_world
 

上記の-Osと-O2の例では、-gオプションが削除されていることに注意してください。これは、コードを最適化するようにコンパイラに指示するときに、コードの特定の行が最終的な実行可能ファイルに存在しなくなり、デバッグが困難になるためです。ただし、最適化がオンの場合にのみ特定のエラーが発生する場合もあります。アプリケーションをデバッグして、コンパイラにコードを最適化させたい場合は、 '-Og'オプションを試してください。これはgccに、デバッグの経験を妨げてはならないすべての最適化を実行するように指示します。

gcc -Wall -g -O0 hello_world.c -o hello_world
 

'-O0'は '-Og'よりもはるかに少ない最適化を実行します。 gccがデフォルトで使用する最適化レベルです。最適化が無効になっていることを確認するには、このオプションを使用します。

gccのバージョンを決定する

gccのドキュメントを参照するときは、実行しているgccのバージョンを知る必要があります。 GCCプロジェクトには、そのバージョンで実装されている機能を含むgccの各バージョンのマニュアルがあります。実行しているgccのバージョンを確認するには、 '-v'オプションを使用してください。

gcc -v
 

出力例:

Using built-in specs.
COLLECT_GCC=/usr/bin/gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)
 

この例では、gccバージョン5.3.1を実行していることがわかります。 GCC 5.3のマニュアルを参照することができます。また、バージョンに固有の問題がある場合に備えて、gccのバージョンを質問に含めると便利です。