「gcc」の版間の差分

提供: C言語入門
移動: 案内検索
(関連項目)
 
(同じ利用者による、間の11版が非表示)
行6: 行6:
  
 
== 概要 ==
 
== 概要 ==
[[gcc]]は、Cコンパイラのコマンド、もしくは、GNU Cコンパイラのパッケージです。
+
[[gcc]]は、Cコンパイラのコマンド、もしくは、GNU Cコンパイラのパッケージです。C++言語用のg++コマンドなども提供されます。
 +
== GCCの意味 ==
 +
'''GCC''' は、当初は、'''GNU C Compiler''' を意味していました。その後、C言語以外に、C++ や Objective-C, FORTRAN, Java などのコンパイラを含むことから '''GNU Compiler Collection) を意味するようになりました。
 +
== gccコマンドの裏側 ==
 +
普段、なにげなく実行している[[gcc]]コマンドさんですが、[[gcc]] がなんでもかんでもやっているのではなく、 [[gcc]] は、他のプログラムを呼び出して、処理をしてもらっています。
 +
 
 +
[[gcc]]コマンドは、Cプログラムのコンパイルの過程で、
 +
# プリプロセッサディレクティブを処理
 +
# アセンブリコードへ変換
 +
# 機械語へ変換
 +
# オブジェクトを結合します。
 +
 
 +
[[gcc]]は、内部的に外部コマンドを呼び出しています。
 +
* cpp
 +
* cc1
 +
* as
 +
* ld
 +
 
 +
[[clang]]に移行する前までのFreeBSD(10未満)では、/usr/libexec/cc1 がありましたが、すでにありません。
 +
<syntaxhighlight lang="bash">
 +
$ cpp a.c -o a.i
 +
$ /usr/libexec/cc1 a.i -o a.s
 +
$ as a.s -o a.o
 +
$ ld \
 +
-lc \
 +
/usr/lib/crt1.o \
 +
/usr/lib/crtbegin.o \
 +
/usr/lib/crtend.o \
 +
/usr/lib/crtendS.o \
 +
/usr/lib/crti.o \
 +
/usr/lib/crtn.o \
 +
a.o \
 +
-o a.out
 +
</syntaxhighlight>
 +
 
 +
/usr/local/libexec/gcc49/gcc/x86_64-portbld-freebsd10.0/4.9.1/cc1
 +
== コンパイル方法 ==
 +
C言語のソースファイルをコンパイルするには、ターミナルで以下の様なコマンドを実行します。
 +
<syntaxhighlight lang="bash">
 +
$ gcc main.c
 +
</syntaxhighlight>
 +
Unix環境(FreeBSD, Linux)のOSでは、出力ファイルを指定しない場合は、デフォルトで、 a.out というファイルを作成します。Windows 環境(MinGW)では、a.exe が作成されます。
 +
 
 +
作成されたファイルは、ターミナルで以下のように実行します。
 +
<syntaxhighlight lang="bash">
 +
$ ./a.out
 +
</syntaxhighlight>
 +
 
 +
Windowsの場合は、以下の通りです。.exe は省略しても構いません。
 +
<syntaxhighlight lang="dos">
 +
c:\c>a.exe
 +
</syntaxhighlight>
 +
もしくは
 +
<syntaxhighlight lang="dos">
 +
c:\c>a
 +
</syntaxhighlight>
 +
となります。
 +
 
 +
a.out (a.exe) ではなく、作成するターゲットのオブジェクト(出来上がるバイナリファイル)の名前を指定することもできます。
 +
<syntaxhighlight lang="bash">
 +
$ gcc main.c -o mycommand
 +
$ ./mycommand
 +
</syntaxhighlight>
 
== 複数のバージョンのGCCの共存 ==
 
== 複数のバージョンのGCCの共存 ==
 
[[FreeBSD]](たいていのLinuxでも)では、複数のバージョンのGCCコンパイラが共存できます。
 
[[FreeBSD]](たいていのLinuxでも)では、複数のバージョンのGCCコンパイラが共存できます。
行25: 行87:
 
gcc-ar49  gcc-nm49  gcc-ranlib49  gcc47
 
gcc-ar49  gcc-nm49  gcc-ranlib49  gcc47
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
== gcc 5.3 ==
 +
* プロシージャ内の最適化機能の向上
 +
* リンク時の最適化機能の向上
 +
* フィードバックダイレクト最適化機能の向上
 +
* レジスタアロケーション機能の向上
 +
* UndefinedBehaviorSanitizerに複数のサニタイズオプションの追加
 +
* [[OpenMP]] 4.0のオフローディング機能をサポート
 +
* Intel Xeon Phiのサポート追加(ランタイムライブラリ、カードエミュレータ)
 +
* [[OpenACC]] 2.0a仕様の実験的サポート
 +
* DragonFly BSDオペレーティングシステムのサポート追加
 +
* FreeBSDにおけるARMポートサポートを追加(arm*-*-freebsd*)
 +
 +
* <u>Cにおけるデフォルトモードを-std=gnu89から'''-std=gnu11'''へ変更</u>
 +
* C++ランタイムライブラリで使用するABIを新しいものへ入れ替え
 +
* ループ最適化のためのGraphiteフレームワークにおいてCLooGライブラリが不要になるように変更
 +
* AVRにおけるサポート対象にATtiny4/5/9/10/20/40を追加
 +
== gcc 5.2 ==
 +
* C言語のデフォルトモードが -std=gnu89 から -std=gnu11 に変更になりました。
 +
* C++ ランタイムライブラリ (libstdc++) は、デフォルトで新しいABIを利用します。
 +
* ループの最適化のためのGraphite framework(高レベルメモリ最適化)は、CLooG ライブラリをもう必要としません。ISL バージョン 0.14(推奨) もしくは 0.12.2 だけが必要です。
 +
* has_trivial_default_constructor, has_trivial_copy_constructor や has_trivial_copy_assign の 非標準の C++0x 型特性(type trait)は廃止予定となり、将来のバージョンで削除されます。標準 C++11  trait の is_trivially_default_constructible, is_trivially_copy_constructible や is_trivially_copy_assignable をかわりに使用しなければなりません。
 +
* ATtiny4/5/9/10/20/40 のデバイスで、 AVR サポートが追加されました。Binutils 2.25 以上が必要です。
 +
* AVR port は、サポートデバイスを記述する新しいスキームを使用します。
 +
== gcc 5.1 ==
 +
* Cのデフォルトモードが -std=gnu89(GNU89)から-std=gnu11(ISO C11ベースのGNU11)に変更されました。
 +
* C++ランタイムライブラリlibstdc++では、新しいAPIをデフォルトで利用します。
 +
* [[OpenMP]] 4.0のオフロード機能がサポートされました。
 +
* [[OpenACC]] 2.0a の初期実装
 +
* [[Cilk Plus]] を完全サポート
 
== gcc 4.10 ==
 
== gcc 4.10 ==
 
* 2014/04 からステージ1がはじまりました。
 
* 2014/04 からステージ1がはじまりました。
 
 
== gcc 4.9 ==
 
== gcc 4.9 ==
 
* 2014/04/22 にリリースされました。
 
* 2014/04/22 にリリースされました。
行40: 行130:
  
 
* C++では、C++11, C++14のサポートしました。
 
* C++では、C++11, C++14のサポートしました。
 
 
== インストール ==
 
== インストール ==
 
=== FreeBSDの場合 ===
 
=== FreeBSDの場合 ===
 +
==== gcc 6 ====
 +
<syntaxhighlight lang="bash">
 +
$ sudo pkg install gcc6
 +
</syntaxhighlight>
 +
==== gcc 5 ====
 +
<syntaxhighlight lang="bash">
 +
$ sudo pkg install gcc5
 +
</syntaxhighlight>
 
==== gcc 4.10 ====
 
==== gcc 4.10 ====
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
行137: 行234:
 
== 関連項目 ==
 
== 関連項目 ==
 
{{compiler}}
 
{{compiler}}
 +
* [[gccコンパイラの使い方]]
 +
* [[gccのコンパイルオプション-fPICと-fpicの違いは?]]
 +
* [[Link Time Optimization]]
 +
 +
== トラブル ==
 +
* [[gxx personality v0 に対する定義されていない参照です]]
 
<!-- vim: filetype=mediawiki
 
<!-- vim: filetype=mediawiki
 
-->
 
-->

2017年9月11日 (月) 23:13時点における最新版

gcc とは、GNUのC/C++コンパイラのパッケージ、もしくは、Cコンパイラのコマンドです。Windows, Linux, FreeBSDなど様々な環境で利用できます。Windowsでは、CygwinやMinGWなどをインストールして利用できます。

読み方

gcc
じーしーしー

概要

gccは、Cコンパイラのコマンド、もしくは、GNU Cコンパイラのパッケージです。C++言語用のg++コマンドなども提供されます。

GCCの意味

GCC は、当初は、GNU C Compiler を意味していました。その後、C言語以外に、C++ や Objective-C, FORTRAN, Java などのコンパイラを含むことから GNU Compiler Collection) を意味するようになりました。

gccコマンドの裏側

普段、なにげなく実行しているgccコマンドさんですが、gcc がなんでもかんでもやっているのではなく、 gcc は、他のプログラムを呼び出して、処理をしてもらっています。

gccコマンドは、Cプログラムのコンパイルの過程で、

  1. プリプロセッサディレクティブを処理
  2. アセンブリコードへ変換
  3. 機械語へ変換
  4. オブジェクトを結合します。

gccは、内部的に外部コマンドを呼び出しています。

  • cpp
  • cc1
  • as
  • ld

clangに移行する前までのFreeBSD(10未満)では、/usr/libexec/cc1 がありましたが、すでにありません。

$ cpp a.c -o a.i
$ /usr/libexec/cc1 a.i -o a.s
$ as a.s -o a.o
$ ld \
	-lc			\
	/usr/lib/crt1.o		\
	/usr/lib/crtbegin.o	\
	/usr/lib/crtend.o	\
	/usr/lib/crtendS.o	\
	/usr/lib/crti.o		\
	/usr/lib/crtn.o		\
	a.o			\
	-o a.out

/usr/local/libexec/gcc49/gcc/x86_64-portbld-freebsd10.0/4.9.1/cc1

コンパイル方法

C言語のソースファイルをコンパイルするには、ターミナルで以下の様なコマンドを実行します。

$ gcc main.c

Unix環境(FreeBSD, Linux)のOSでは、出力ファイルを指定しない場合は、デフォルトで、 a.out というファイルを作成します。Windows 環境(MinGW)では、a.exe が作成されます。

作成されたファイルは、ターミナルで以下のように実行します。

$ ./a.out

Windowsの場合は、以下の通りです。.exe は省略しても構いません。

c:\c>a.exe

もしくは

c:\c>a

となります。

a.out (a.exe) ではなく、作成するターゲットのオブジェクト(出来上がるバイナリファイル)の名前を指定することもできます。

$ gcc main.c -o mycommand
$ ./mycommand

複数のバージョンのGCCの共存

FreeBSD(たいていのLinuxでも)では、複数のバージョンのGCCコンパイラが共存できます。

下記の例では、GCC 4.6, 4,7, 4.9 が同居しています。

$ pkg info |ag gcc
gcc-4.7.3_1                    GNU Compiler Collection 4.7
gcc-ecj-4.5                    Eclipse Java Compiler used to build GCC Java
gcc46-4.6.4_1,1                GNU Compiler Collection 4.6
gcc49-4.9.1.s20140507          GNU Compiler Collection 4.9

zshの入力補完の例ですが、gccの名前のあとにバージョン番号がそれぞれ付与されたコマンドが用意されています。必要に応じて、任意の番号のついたgccコマンドを実行することで、複数のバージョンのgccを使い分けることができます。

$ gcc
gcc-ar47  gcc-nm47  gcc-ranlib47  gcc46  gcc49
gcc-ar49  gcc-nm49  gcc-ranlib49  gcc47

gcc 5.3

  • プロシージャ内の最適化機能の向上
  • リンク時の最適化機能の向上
  • フィードバックダイレクト最適化機能の向上
  • レジスタアロケーション機能の向上
  • UndefinedBehaviorSanitizerに複数のサニタイズオプションの追加
  • OpenMP 4.0のオフローディング機能をサポート
  • Intel Xeon Phiのサポート追加(ランタイムライブラリ、カードエミュレータ)
  • OpenACC 2.0a仕様の実験的サポート
  • DragonFly BSDオペレーティングシステムのサポート追加
  • FreeBSDにおけるARMポートサポートを追加(arm*-*-freebsd*)
  • Cにおけるデフォルトモードを-std=gnu89から-std=gnu11へ変更
  • C++ランタイムライブラリで使用するABIを新しいものへ入れ替え
  • ループ最適化のためのGraphiteフレームワークにおいてCLooGライブラリが不要になるように変更
  • AVRにおけるサポート対象にATtiny4/5/9/10/20/40を追加

gcc 5.2

  • C言語のデフォルトモードが -std=gnu89 から -std=gnu11 に変更になりました。
  • C++ ランタイムライブラリ (libstdc++) は、デフォルトで新しいABIを利用します。
  • ループの最適化のためのGraphite framework(高レベルメモリ最適化)は、CLooG ライブラリをもう必要としません。ISL バージョン 0.14(推奨) もしくは 0.12.2 だけが必要です。
  • has_trivial_default_constructor, has_trivial_copy_constructor や has_trivial_copy_assign の 非標準の C++0x 型特性(type trait)は廃止予定となり、将来のバージョンで削除されます。標準 C++11 trait の is_trivially_default_constructible, is_trivially_copy_constructible や is_trivially_copy_assignable をかわりに使用しなければなりません。
  • ATtiny4/5/9/10/20/40 のデバイスで、 AVR サポートが追加されました。Binutils 2.25 以上が必要です。
  • AVR port は、サポートデバイスを記述する新しいスキームを使用します。

gcc 5.1

  • Cのデフォルトモードが -std=gnu89(GNU89)から-std=gnu11(ISO C11ベースのGNU11)に変更されました。
  • C++ランタイムライブラリlibstdc++では、新しいAPIをデフォルトで利用します。
  • OpenMP 4.0のオフロード機能がサポートされました。
  • OpenACC 2.0a の初期実装
  • Cilk Plus を完全サポート

gcc 4.10

  • 2014/04 からステージ1がはじまりました。

gcc 4.9

  • 2014/04/22 にリリースされました。
  • コンパイルのエラーなどをカラー表示する -fdiagnostics-color=auto のオプションが追加されました。環境変数 GCC_COLORS でも設定できます。デフォルトのカラー設定は、
    $ export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
    です。
  • 並列プログラミングAPI OpenMP 4.0をサポートしました
    • アクセラレータのサポートされました
  • インテルが開発する並列処理の機能の Cilk Plus が部分的に実装されました。
    • 簡単なプログラミング・モデルで並列プログラムを記述できます。
    • 3つのキーワードで、並列プログラムが開発できます。
  • C++では、C++11, C++14のサポートしました。

インストール

FreeBSDの場合

gcc 6

$ sudo pkg install gcc6

gcc 5

$ sudo pkg install gcc5

gcc 4.10

$ sudo pkg install gcc410

gcc 4.9

$ sudo pkg install gcc49
To ensure binaries built with this toolchain find appropriate versions
of the necessary run-time libraries, you may want to link using
 
  -Wl,-rpath=/usr/local/lib/gcc49
 
For ports leveraging USE_GCC, USES=compiler, or USES=fortran this happens
transparently.

gcc 4.8

$ sudo pkg install gcc48

gcc 4.7

$ sudo pkg install gcc47

gcc 4.6

$ sudo pkg install gcc46

Windows環境

CygwinやMinGWでgccが提供されます。

MinGW では、gcc 4.8.1 が使用できます。

C:\Program Files\mingw-builds\x64-4.8.1-posix-seh-rev5\mingw64\bin\gcc.exe

にインスールされています。

C:\Program Files\mingw-builds\x64-4.8.1-posix-seh-rev5\mingwbuilds.bat

を起動するとパスが通った状態で、コマンドプロントが利用できます。

C:\Program Files\mingw-builds\x64-4.8.1-posix-seh-rev5\mingw64\bin>gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/program\ files/mingw-builds/x64-4.8.1-posix-seh-rev5/ming
w64/bin/../libexec/gcc/x86_64-w64-mingw32/4.8.1/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-4.8.1/configure --host=x86_64-w64-mingw32 --bu
ild=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysr
oot=/tmp/x64-481-posix-seh-r5/mingw64 --enable-shared --enable-static --disable-
multilib --enable-languages=ada,c,c++,fortran,objc,obj-c++,lto --enable-libstdcx
x-time=yes --enable-threads=posix --enable-libgomp --enable-lto --enable-graphit
e --enable-checking=release --enable-fully-dynamic-string --enable-version-speci
fic-runtime-libs --disable-isl-version-check --disable-cloog-version-check --dis
able-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath
--disable-win32-registry --disable-nls --disable-werror --disable-symvers --with
-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --wit
h-system-zlib --with-gmp=/tmp/mingw-prereq/x86_64-w64-mingw32-static --with-mpfr
=/tmp/mingw-prereq/x86_64-w64-mingw32-static --with-mpc=/tmp/mingw-prereq/x86_64
-w64-mingw32-static --with-isl=/tmp/mingw-prereq/x86_64-w64-mingw32-static --wit
h-cloog=/tmp/mingw-prereq/x86_64-w64-mingw32-static --enable-cloog-backend=isl -
-with-pkgversion='rev5, Built by MinGW-W64 project' --with-bugurl=http://sourcef
orge.net/projects/mingw-w64 CFLAGS='-O2 -pipe -I/tmp/x64-481-posix-seh-r5/libs/i
nclude -I/tmp/mingw-prereq/x64-zlib/include -I/tmp/mingw-prereq/x86_64-w64-mingw
32-static/include' CXXFLAGS='-O2 -pipe -I/tmp/x64-481-posix-seh-r5/libs/include
-I/tmp/mingw-prereq/x64-zlib/include -I/tmp/mingw-prereq/x86_64-w64-mingw32-stat
ic/include' CPPFLAGS= LDFLAGS='-pipe -L/tmp/x64-481-posix-seh-r5/libs/lib -L/tmp
/mingw-prereq/x64-zlib/lib -L/tmp/mingw-prereq/x86_64-w64-mingw32-static/lib -L/
tmp/x64-481-posix-seh-r5/mingw64/opt/lib '
Thread model: posix
gcc version 4.8.1 (rev5, Built by MinGW-W64 project)
 
C:\Program Files\mingw-builds\x64-4.8.1-posix-seh-rev5\mingw64\bin>g++ --version
 
g++ (rev5, Built by MinGW-W64 project) 4.8.1
Copyright (C) 2013 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.

実行例

FreeBSDの場合

g++49 -std=c++11 -Wl,-rpath=/usr/local/lib/gcc49/

関連項目

トラブル