gcc
Usage
直接コマンドを実行するなら:
g++ -g -Wall -Wextra -O3 main.cpp -o a.out
make や CMake などのツールを使ってビルドすることが多く、 ターミナルからコンパイラを直接実行することはほぼ無い。
Options
- https://gcc.gnu.org/onlinedocs/gcc/Invoking-GCC.html
- https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
出力オプション
https://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html
-c- コンパイルするだけでリンクしない
-o {file}- 出力先のファイル名を指定
C/C++オプション
https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html
-std=c++11- 2011年のISO標準でコンパイルする。
-std=c++14- 2014年のISO標準でコンパイルする。
g++-6 ではこれのGNU方言である
gnu++14がデフォルトになった。
警告オプション
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
-Wall- 基本的な警告
-Wextra- Wallより厳しい警告
-Werror- 警告をエラー扱いにする
デバッグオプション
https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html
-g- gdb で使えるデバッグ情報を埋め込む
最適化オプション
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
-O1- 軽い最適化
-O2- プログラムサイズを大きくしない最適化をすべて実行
-O3- インライン展開なども行う
-Os- コードサイズが最小になるように
プリプロセッサオプション
https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html
-D {name},-D {name=definition}- ソースコードで
#defineするのと同じようにマクロを定義する -I {dir},-isystem {dir}#include <***>のインクルードパスの先頭に{dir}を追加。-iquote {dir}#include "***"のインクルードパスの先頭に{dir}を追加。-M,-MM- ファイルの依存関係を書き出す。 前者はシステムヘッダーを含み、後者は含まない。
リンクオプション
https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
-l {library}- リンクするライブラリを指定する。
ファイル名が
libsfmt.aのときは-lsfmt -L {dir}- ライブラリのサーチパスを追加する
Installation
Mac
Macにある /usr/bin/gcc は
gcc の顔をした clang なので、
本物の gcc が欲しいときは別途インストールが必要。
Homebrew で入れるのが楽チン:
brew install gcc
Ubuntu
元から入ってるけど最新版をソースからインストールしたい。
-
gmp, mpfr, mpc をインストール:
sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev -
--with-system-zlibでビルドするには zlib が必要:sudo apt-get install zlib1g-dev -
システムに既に入ってるやつの
configureオプションをgcc -v見るでみて、それを参考にconfigure--enable-languagesは使う言語だけに--prefixは/usr/local- 既存のバージョンとごっちゃになるのを避けるため
--program-suffixを設定 - 他言語サポートは不要なので
--disable-nls --disable-multilibを付けないとfatal error: gnu/stubs-32.h: No such file or directory. stub-32.hなどと怒られて止まる
get -O- http://ftp.gnu.org/gnu/gcc/gcc-4.9.1/gcc-4.9.1.tar.bz2 | tar xj kdir build d build/ ./gcc-4.9.1/configure --enable-languages=c,c++,go,fortran --prefix=/usr/local --program-suffix=-4.9 --enable-shared --enable-linker-build-id --without-included-gettext --enable-threads=posix --disable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-gtk-cairo --with-arch-directory=amd64 --enable-multiarch --disable-werror --with-abi=m64 --disable-multilib --with-tune=core2 --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu -
コンパイル。ただしデフォルトではコンパイラオプションが
-g O2となっていて膨大なデバッグシンボルがついた状態で出来上がってしまうらしいので、 オプションを上書きしてそれを回避する:make BOOT_CFLAGS="-O2" CFLAGS="-O2" CXXFLAGS="-O2" bootstrapfatal error: bits/predefs.h: No such file or directoryって怒られたら:sudo apt-get install libc6-dev-i386/usr/bin/ld: cannot find crti.o: No such file or directoryって怒られたら:sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64 -
sudo make installでインストール。の前にmake DESTDIR=${HOME}/tmp/gcc-test installなどとしてテストするといいらしい。 ディスクレスクラスタの場合、子ノードにもインストール:sudo make DESTDIR=/nfsroot install