「g++」の版間の差分
(同じ利用者による、間の10版が非表示) | |||
行1: | 行1: | ||
− | [[g++]] は、 GNU GCC (GNUコンパイラコレクション) の [[C++]] | + | [[g++]] は、 GNU GCC (GNUコンパイラコレクション) の [[C++]] コンパイラコマンド([[C++コンパイラ]])です。[[g++]]の主な使い方、オプションなどを紹介します。一部の環境では、[[c++]]コマンドの実体は、[[g++]]コマンドです。[[c++]]コマンドについては、「[[c++]]」をご参照ください。正式なリリースの最新版は、[[g++]] 7.2です。 |
'''読み方''' | '''読み方''' | ||
行7: | 行7: | ||
== 概要 == | == 概要 == | ||
− | [[g++]] は、GNU の GCC に含まれる [[C++]] | + | [[g++]] は、GNU の GCC に含まれる [[C++]] のコンパイラ([[C++コンパイラ]])です。Unix や Windows で [[g++]] コマンドとして利用します。 |
− | FreeBSD の場合、デフォルトで [[C++]] コンパイラとして [[g++]] | + | FreeBSD 10.0-RELEASE以前のFreeBSD の場合、デフォルトで [[C++]] コンパイラとして [[g++]] がインストールされていました。FreeBSD の [[g++]] コマンドと [[c++]] コマンドは、同じものでした。FreeBSD 10.0-RELEASEからは、デフォルトのコンパイラがclang/[[clang++]]に変更されています。 |
FreeBSD は、標準でコンパイラが付属していますが、 ports コレクションを利用して gcc ([[g++]]が含まれます)をインストールすることで、システム標準のコンパイラよりも新しいコンパイラを導入できます。 | FreeBSD は、標準でコンパイラが付属していますが、 ports コレクションを利用して gcc ([[g++]]が含まれます)をインストールすることで、システム標準のコンパイラよりも新しいコンパイラを導入できます。 | ||
下記のコマンドでインストールできるgccが調べられます。 | 下記のコマンドでインストールできるgccが調べられます。 | ||
行15: | 行15: | ||
ls -d /usr/ports/lang/gcc* | ls -d /usr/ports/lang/gcc* | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | もしくは | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | pkg search gcc | ||
+ | </syntaxhighlight> | ||
+ | で検索できます。 | ||
システムの[[g++]]コマンドは、/usr/bin にあり、 ports からインストールした [[g++]] は、 /usr/local/bin に配置されます。 | システムの[[g++]]コマンドは、/usr/bin にあり、 ports からインストールした [[g++]] は、 /usr/local/bin に配置されます。 | ||
− | |||
CentOS の場合は、[[g++]]コマンドがデフォルトでは入っていません。yum コマンドで gcc-g++ パッケージをインストールすることで、[[g++]]コマンドが利用できます。 | CentOS の場合は、[[g++]]コマンドがデフォルトでは入っていません。yum コマンドで gcc-g++ パッケージをインストールすることで、[[g++]]コマンドが利用できます。 | ||
− | + | Ubuntuならapt-cacheで検索できます。 | |
− | + | <syntaxhighlight lang="bash"> | |
− | + | apt-cache search g++ | |
+ | </syntaxhighlight> | ||
== インストール == | == インストール == | ||
* [[g++をFreeBSDへインストールする]] | * [[g++をFreeBSDへインストールする]] | ||
* [[g++をCentOSへインストールする]] | * [[g++をCentOSへインストールする]] | ||
* [[g++をUbuntuへインストールする]] | * [[g++をUbuntuへインストールする]] | ||
− | + | * [[g++をWindowsへインストールする]] | |
− | + | ** mingw, cygwinを使用します。 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
== コンパイル == | == コンパイル == | ||
− | |||
=== バイナリを作成する === | === バイナリを作成する === | ||
− | + | いわゆる、コンパイルを行います。以下の例では、ELF形式などの実行可能なファイルを作成します。a.outができます。 | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
g++ foo.cpp | g++ foo.cpp | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | = | + | 作成する実行ファイルを指定する例です。実行ファイルは、 foo という名前で作成されます。 |
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ foo.cpp -o foo | ||
+ | </syntaxhighlight> | ||
+ | デバッグ情報を付加して、a.outを作成します。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
− | g++ - | + | g++ -g foo.cpp |
</syntaxhighlight> | </syntaxhighlight> | ||
+ | foo.cppとbar.cppをコンパイルして、実行ファイルa.outを作成します。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ foo.cpp bar.cpp | ||
+ | </syntaxhighlight> | ||
+ | === オブジェクトファイルを作成する === | ||
+ | オブジェクトファイル foo.o を作成します。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ -c foo.cpp | ||
+ | </syntaxhighlight> | ||
+ | ファイルごとにオブジェクトファイルを作成しておくと、再コンパイルが速くなります。 | ||
=== シェアードオブジェクトを作成する === | === シェアードオブジェクトを作成する === | ||
− | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
g++ -shared -o libfoo.so foo.cpp | g++ -shared -o libfoo.so foo.cpp | ||
+ | </syntaxhighlight> | ||
+ | === インクルードディレクトリを追加する === | ||
+ | /usr/local/include ディレクトリをインクルードパスとして追加します。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ -I/usr/local/include main.cpp | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | /usr/local/include ディレクトリとカレントディレクトリの./includeをインクルードパスとして追加します。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ -I/usr/local/include -I./include main.cpp | ||
+ | </syntaxhighlight> | ||
+ | === ライブラリをリンクする === | ||
+ | 標準ライブラリをリンクする例です。mathライブラリ(/usr/lib/libm.so)をリンクする場合は、以下の通りです。/usr/lib のライブラリがリンクされます。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ -lm main.cpp | ||
+ | </syntaxhighlight> | ||
+ | === ライブラリパスを追加してリンクする === | ||
+ | /usr/local/libにあるlibfoo.soをリンクします。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ -L/usr/local/lib -Lfoo main.cpp | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== コンパイル最適化レベルを変更する === | === コンパイル最適化レベルを変更する === | ||
+ | == 最適化オプション == | ||
+ | コンパイルするときに、コンパイラで最適化を行えます。最適化によりパフォーマンスアップなどの恩恵が得られます。 | ||
+ | 詳しくは、 [[g++ 最適化オプション]]をご参照ください。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
行64: | 行100: | ||
=== プリプロセッサディレクティブを処理する === | === プリプロセッサディレクティブを処理する === | ||
− | + | プリプロセッサディレクティブの処理を行った結果を標準出力に出力します。 | |
+ | プリプロセッサの処理の結果がどうなるのか、確認する場合に使えます。 | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
g++ -E foo.cpp | g++ -E foo.cpp | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
=== アセンブルして、アセンブリコードを得る === | === アセンブルして、アセンブリコードを得る === | ||
− | |||
foo.cpp から GAS 形式のアセンブラ言語で記述された foo.s を得られます。 | foo.cpp から GAS 形式のアセンブラ言語で記述された foo.s を得られます。 | ||
− | + | コンパイラが生成するアセンブリコードを確認する場合に使用します。 | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
g++ -S foo.cpp | g++ -S foo.cpp | ||
行82: | 行117: | ||
g++ -g -S foo.cpp | g++ -g -S foo.cpp | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | |||
== 実行例 == | == 実行例 == | ||
− | + | === コマンドラインオプション === | |
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
$ g++ --version | $ g++ --version | ||
行145: | 行179: | ||
<URL:http://gcc.gnu.org/bugs.html>. | <URL:http://gcc.gnu.org/bugs.html>. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | == 警告オプション == | |
+ | 警告の-W オプションを有効にします。できるだけ、このオプションを使用したほうがいいでしょう。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ -Wall main.cpp | ||
+ | </syntaxhighlight> | ||
+ | == C++11,C++14(C++xx)などの機能を有効にする == | ||
+ | [[C++11]], [[C++14]] など新しい C++ の規格の機能を利用する場合には、-stdオプションで規格を指定します。新しい機能を使うには、新しい[[g++]]コマンドが必要になることがあります。新しいコンパイラが必要な場合には、[[C++コンパイラ]]のパッケージをアップデートする、または、新しいパッケージを別途インストールしてください。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | $ g++ -std=c++11 main.cpp | ||
+ | $ g++ -std=c++14 main.cpp | ||
+ | </syntaxhighlight> | ||
== コンパイルオプション == | == コンパイルオプション == | ||
自分で[[g++]]をコンパイルして入れたときに、場合によっては、以下のようなエラーが出るかもしれません。自分でインストールしたGCCのライブラリが/usr/local/lib の下にインストールされている場合、ベースシステムのライブラリとリンクされ、以下の現象がおきます。 | 自分で[[g++]]をコンパイルして入れたときに、場合によっては、以下のようなエラーが出るかもしれません。自分でインストールしたGCCのライブラリが/usr/local/lib の下にインストールされている場合、ベースシステムのライブラリとリンクされ、以下の現象がおきます。 | ||
行174: | 行218: | ||
-Wl,-rpath=/usr/local/lib/gcc48/ lambda_return2.cpp | -Wl,-rpath=/usr/local/lib/gcc48/ lambda_return2.cpp | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | == GCC5のg++ == | |
+ | * [[C++14]]の[[変数テンプレート]](Variable Templates)をサポートしました。 | ||
+ | * -Wnon-virtual-dtor は、 final クラスで警告しません。 | ||
+ | * template template パラメータで typename を許します。 <syntaxhighlight lang="cpp"> template<template<typename> typename X> struct D; </syntaxhighlight> | ||
+ | * [[C++14]]で、非静的データメンバーの初期化をサポート | ||
+ | *:struct A { int i , j = i }; | ||
+ | *:A a = { 123 }; // a.j も 123 になる。 | ||
+ | * [[C++14]]で[[constexpr]]を拡張 | ||
+ | *: constexpr int f( int i ) | ||
+ | *: { | ||
+ | *:: int j = 0; | ||
+ | *:: for (; i > 0; --i) { | ||
+ | *::: ++j; | ||
+ | *:: } | ||
+ | *:: return j; | ||
+ | *: } | ||
+ | *: constexpr int i = f (42); // i は 42 | ||
+ | * [[C++14]] sized deallocation 関数のサポート <syntaxhighlight lang="cpp"> void operator delete (void *, std::size_t) noexcept; </syntaxhighlight> <syntaxhighlight lang="cpp"> void operator delete[] (void *, std::size_t) noexcept; </syntaxhighlight> | ||
== 関連項目 == | == 関連項目 == | ||
* [[C++コンパイラ]] | * [[C++コンパイラ]] | ||
* [[C++開発環境]] | * [[C++開発環境]] | ||
− | <!-- vim: filetype=mediawiki --> | + | * [[c++]] |
+ | {{g++}} | ||
+ | <!-- vim: filetype=mediawiki | ||
+ | --> |
2017年10月30日 (月) 23:50時点における最新版
g++ は、 GNU GCC (GNUコンパイラコレクション) の C++ コンパイラコマンド(C++コンパイラ)です。g++の主な使い方、オプションなどを紹介します。一部の環境では、c++コマンドの実体は、g++コマンドです。c++コマンドについては、「c++」をご参照ください。正式なリリースの最新版は、g++ 7.2です。
読み方
- g++
- じー ぷらす ぷらす、じー ぷらぷら
目次
概要
g++ は、GNU の GCC に含まれる C++ のコンパイラ(C++コンパイラ)です。Unix や Windows で g++ コマンドとして利用します。
FreeBSD 10.0-RELEASE以前のFreeBSD の場合、デフォルトで C++ コンパイラとして g++ がインストールされていました。FreeBSD の g++ コマンドと c++ コマンドは、同じものでした。FreeBSD 10.0-RELEASEからは、デフォルトのコンパイラがclang/clang++に変更されています。 FreeBSD は、標準でコンパイラが付属していますが、 ports コレクションを利用して gcc (g++が含まれます)をインストールすることで、システム標準のコンパイラよりも新しいコンパイラを導入できます。 下記のコマンドでインストールできるgccが調べられます。
ls -d /usr/ports/lang/gcc*
もしくは
pkg search gcc
で検索できます。
システムのg++コマンドは、/usr/bin にあり、 ports からインストールした g++ は、 /usr/local/bin に配置されます。
CentOS の場合は、g++コマンドがデフォルトでは入っていません。yum コマンドで gcc-g++ パッケージをインストールすることで、g++コマンドが利用できます。 Ubuntuならapt-cacheで検索できます。
apt-cache search g++
インストール
- g++をFreeBSDへインストールする
- g++をCentOSへインストールする
- g++をUbuntuへインストールする
- g++をWindowsへインストールする
- mingw, cygwinを使用します。
コンパイル
バイナリを作成する
いわゆる、コンパイルを行います。以下の例では、ELF形式などの実行可能なファイルを作成します。a.outができます。
g++ foo.cpp
作成する実行ファイルを指定する例です。実行ファイルは、 foo という名前で作成されます。
g++ foo.cpp -o foo
デバッグ情報を付加して、a.outを作成します。
g++ -g foo.cpp
foo.cppとbar.cppをコンパイルして、実行ファイルa.outを作成します。
g++ foo.cpp bar.cpp
オブジェクトファイルを作成する
オブジェクトファイル foo.o を作成します。
g++ -c foo.cpp
ファイルごとにオブジェクトファイルを作成しておくと、再コンパイルが速くなります。
シェアードオブジェクトを作成する
g++ -shared -o libfoo.so foo.cpp
インクルードディレクトリを追加する
/usr/local/include ディレクトリをインクルードパスとして追加します。
g++ -I/usr/local/include main.cpp
/usr/local/include ディレクトリとカレントディレクトリの./includeをインクルードパスとして追加します。
g++ -I/usr/local/include -I./include main.cpp
ライブラリをリンクする
標準ライブラリをリンクする例です。mathライブラリ(/usr/lib/libm.so)をリンクする場合は、以下の通りです。/usr/lib のライブラリがリンクされます。
g++ -lm main.cpp
ライブラリパスを追加してリンクする
/usr/local/libにあるlibfoo.soをリンクします。
g++ -L/usr/local/lib -Lfoo main.cpp
コンパイル最適化レベルを変更する
最適化オプション
コンパイルするときに、コンパイラで最適化を行えます。最適化によりパフォーマンスアップなどの恩恵が得られます。 詳しくは、 g++ 最適化オプションをご参照ください。
g++ -O foo.cpp g++ -O0 foo.cpp g++ -O2 foo.cpp g++ -O3 foo.cpp g++ -Os foo.cpp
プリプロセッサディレクティブを処理する
プリプロセッサディレクティブの処理を行った結果を標準出力に出力します。 プリプロセッサの処理の結果がどうなるのか、確認する場合に使えます。
g++ -E foo.cpp
アセンブルして、アセンブリコードを得る
foo.cpp から GAS 形式のアセンブラ言語で記述された foo.s を得られます。 コンパイラが生成するアセンブリコードを確認する場合に使用します。
g++ -S foo.cpp
-g オプションを使用すると C++ ソースファイルの行番号が .loc に含まれます。 アセンブラ言語を読みたいときに便利です。しかし、 foo.s のコード量が非常に大きくなります。
g++ -g -S foo.cpp
実行例
コマンドラインオプション
$ g++ --version g++ (GCC) 4.2.1 20070831 patched [FreeBSD] Copyright (C) 2007 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. $ g++ --help Usage: g++ [options] file... Options: -pass-exit-codes Exit with highest error code from a phase --help Display this information --target-help Display target specific command line options (Use '-v --help' to display command line options of sub-processes) -dumpspecs Display all of the built in spec strings -dumpversion Display the version of the compiler -dumpmachine Display the compiler's target processor -print-search-dirs Display the directories in the compiler's search path -print-libgcc-file-name Display the name of the compiler's companion library -print-file-name=<lib> Display the full path to library <lib> -print-prog-name=<prog> Display the full path to compiler component <prog> -print-multi-directory Display the root directory for versions of libgcc -print-multi-lib Display the mapping between command line options and multiple library search directories -print-multi-os-directory Display the relative path to OS libraries -Wa,<options> Pass comma-separated <options> on to the assembler -Wp,<options> Pass comma-separated <options> on to the preprocessor -Wl,<options> Pass comma-separated <options> on to the linker -Xassembler <arg> Pass <arg> on to the assembler -Xpreprocessor <arg> Pass <arg> on to the preprocessor -Xlinker <arg> Pass <arg> on to the linker -combine Pass multiple source files to compiler at once -save-temps Do not delete intermediate files -pipe Use pipes rather than intermediate files -time Time the execution of each subprocess -specs=<file> Override built-in specs with the contents of <file> -std=<standard> Assume that the input sources are for <standard> --sysroot=<directory> Use <directory> as the root directory for headers and libraries -B <directory> Add <directory> to the compiler's search paths -b <machine> Run gcc for target <machine>, if installed -V <version> Run gcc version number <version>, if installed -v Display the programs invoked by the compiler -### Like -v but options quoted and commands not executed -E Preprocess only; do not compile, assemble or link -S Compile only; do not assemble or link -c Compile and assemble, but do not link -o <file> Place the output into <file> -x <language> Specify the language of the following input files Permissible languages include: c c++ assembler none 'none' means revert to the default behavior of guessing the language based on the file's extension Options starting with -g, -f, -m, -O, -W, or --param are automatically passed on to the various sub-processes invoked by g++. In order to pass other options on to these processes the -W<letter> options must be used. For bug reporting instructions, please see: <URL:http://gcc.gnu.org/bugs.html>.
警告オプション
警告の-W オプションを有効にします。できるだけ、このオプションを使用したほうがいいでしょう。
g++ -Wall main.cpp
C++11,C++14(C++xx)などの機能を有効にする
C++11, C++14 など新しい C++ の規格の機能を利用する場合には、-stdオプションで規格を指定します。新しい機能を使うには、新しいg++コマンドが必要になることがあります。新しいコンパイラが必要な場合には、C++コンパイラのパッケージをアップデートする、または、新しいパッケージを別途インストールしてください。
$ g++ -std=c++11 main.cpp $ g++ -std=c++14 main.cpp
コンパイルオプション
自分でg++をコンパイルして入れたときに、場合によっては、以下のようなエラーが出るかもしれません。自分でインストールしたGCCのライブラリが/usr/local/lib の下にインストールされている場合、ベースシステムのライブラリとリンクされ、以下の現象がおきます。
% g++49 -std=c++11 lambda_return2.cpp % ./a.out /usr/lib/libstdc++.so.6: version GLIBCXX_3.4.14 required by /tmplambda/a.out not found % ldd ./a.out ./a.out: libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x2806b000) libm.so.5 => /lib/libm.so.5 (0x28166000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x28181000) libc.so.7 => /lib/libc.so.7 (0x2818c000)
g++ 4.9なら以下のコマンドになります。
g++49 -g -ggdb -fPIC -std=c++11 -I/usr/local/lib/gcc49/include/c++ \ -I/usr/local/lib/gcc49/include/ -L/usr/local/lib/gcc49 \ -Wl,-rpath=/usr/local/lib/gcc49/ lambda_return2.cpp
g++ 4.8なら以下のコマンドになります。
g++48 -g -ggdb -fPIC -std=c++11 -I/usr/local/lib/gcc48/include/c++ \ -I/usr/local/lib/gcc48/include/ -L/usr/local/lib/gcc48 \ -Wl,-rpath=/usr/local/lib/gcc48/ lambda_return2.cpp
GCC5のg++
- C++14の変数テンプレート(Variable Templates)をサポートしました。
- -Wnon-virtual-dtor は、 final クラスで警告しません。
- template template パラメータで typename を許します。
template<template<typename> typename X> struct D;
- C++14で、非静的データメンバーの初期化をサポート
- struct A { int i , j = i };
- A a = { 123 }; // a.j も 123 になる。
- C++14でconstexprを拡張
- constexpr int f( int i )
- {
- int j = 0;
- for (; i > 0; --i) {
- ++j;
- }
- return j;
- }
- constexpr int i = f (42); // i は 42
- C++14 sized deallocation 関数のサポート
void operator delete (void *, std::size_t) noexcept;
void operator delete[] (void *, std::size_t) noexcept;