「g++」の版間の差分

提供: C++入門
移動: 案内検索
(インストール)
 
(同じ利用者による、間の9版が非表示)
行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++]] のコンパイラです。Unix や Windows で [[g++]] コマンドとして利用します。
+
[[g++]] は、GNU の GCC に含まれる [[C++]] のコンパイラ([[C++コンパイラ]])です。Unix や Windows で [[g++]] コマンドとして利用します。
  
FreeBSD の場合、デフォルトで [[C++]] コンパイラとして [[g++]] がインストールされます。FreeBSD の [[g++]] コマンドと [[c++]] コマンドは、同じものです。
+
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で検索できます。
* [[g++ 最適化オプション]]
+
<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++ -o foo.cpp
+
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">
行59: 行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
行77: 行117:
 
g++ -g -S foo.cpp
 
g++ -g -S foo.cpp
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
== 実行例 ==
 
== 実行例 ==
 
+
=== コマンドラインオプション ===
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
 
$ g++ --version
 
$ g++ --version
行140: 行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 の下にインストールされている場合、ベースシステムのライブラリとリンクされ、以下の現象がおきます。
行169: 行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++

インストール

コンパイル

バイナリを作成する

いわゆる、コンパイルを行います。以下の例では、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++14constexprを拡張
    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;

関連項目