「gcc」の版間の差分
(→gcc 4.9) |
(→関連項目) |
||
(同じ利用者による、間の15版が非表示) | |||
行6: | 行6: | ||
== 概要 == | == 概要 == | ||
− | [[gcc]]は、Cコンパイラのコマンド、もしくは、GNU | + | [[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の共存 == | ||
+ | [[FreeBSD]](たいていのLinuxでも)では、複数のバージョンのGCCコンパイラが共存できます。 | ||
+ | |||
+ | 下記の例では、GCC 4.6, 4,7, 4.9 が同居しています。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | zshの入力補完の例ですが、[[gcc]]の名前のあとにバージョン番号がそれぞれ付与されたコマンドが用意されています。必要に応じて、任意の番号のついた[[gcc]]コマンドを実行することで、複数のバージョンのgccを使い分けることができます。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ gcc | ||
+ | gcc-ar47 gcc-nm47 gcc-ranlib47 gcc46 gcc49 | ||
+ | gcc-ar49 gcc-nm49 gcc-ranlib49 gcc47 | ||
+ | </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 == | ||
+ | * 2014/04 からステージ1がはじまりました。 | ||
== gcc 4.9 == | == gcc 4.9 == | ||
* 2014/04/22 にリリースされました。 | * 2014/04/22 にリリースされました。 | ||
+ | * コンパイルのエラーなどをカラー表示する -fdiagnostics-color=auto のオプションが追加されました。環境変数 GCC_COLORS でも設定できます。デフォルトのカラー設定は、<syntaxhighlight lang="bash"> | ||
+ | $ export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' | ||
+ | </syntaxhighlight> です。 | ||
* 並列プログラミングAPI [[OpenMP]] 4.0をサポートしました | * 並列プログラミングAPI [[OpenMP]] 4.0をサポートしました | ||
** アクセラレータのサポートされました | ** アクセラレータのサポートされました | ||
行17: | 行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 ==== | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ sudo pkg install gcc410 | ||
+ | </syntaxhighlight> | ||
==== gcc 4.9 ==== | ==== gcc 4.9 ==== | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
行110: | 行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プログラムのコンパイルの過程で、
- プリプロセッサディレクティブを処理
- アセンブリコードへ変換
- 機械語へ変換
- オブジェクトを結合します。
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が提供されます。
- https://sourceware.org/cygwin/
- http://www.mingw.org/
- http://mingw-w64.sourceforge.net/
- Windows 64bit用の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/