スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

GCCの最新バージョンをインストールする。

gcc最新バージョンのビルドインストール


なお現時点の最新バージョンは多分4.9です。

    この記事を読むにあたって必要なもの
  • ある程度ビルドインストールの流れを知っていること

  • マシンのバックアップとレストアができること(推奨)
    => make installではパッケージマネージャに履歴が残りません。


    この記事でわかること
  • 公式のgitにあるgccのビルド方法

  • update-alternativesの簡単な使い方

  • gccの「致命的エラー: iostream: そのようなファイルや…」の暫定的解決方法


    この記事ではわからないこと
  • パッケージマネージャを使ったgccのインストール方法



この記事でなにかが起こったとしても自己責任でお願いします。
文中の「x86_64」や「lib64」等は各自環境に読み替えてください。

よーし、じゃあビルドするぞー。

ネット回線に余裕のある方はこの時点からgccをgit cloneしておいた方がいいかもしれません。
ここに書いてあるgitのURLをクローンします。
$ git clone git://gcc.gnu.org/git/gcc.git

私的にはtmux等のターミナルマルチプレクサーを使って進行状況をチェックした方がいいと思いますが、
バックグラウンドでクローンするには以下のコマンドです。(エラー以外出力されません)
$ git clone git://gcc.gnu.org/git/gcc.git > /dev/null &



まずは必要になる別途のソフトウェアをインストールしていきます。(参考サイト様)
    configureに必要になるライブラリ類(make install)
  1. gmp -> http://gmplib.org/

  2. mpfr -> http://www.mpfr.org/

  3. mpc -> http://www.multiprecision.org/


    1. これを上から順にビルドインストールしていきます。
      操作は参考サイトさまを見てください。
      参考程度にも私の操作を載せておきます。
      (lzipを解凍)
      $ dpkg -l | grep lzip
      $ sudo apt-get install -y lzip (上記コマンドで表示が何もなければ)
      $ tar xvf (対象).tar.lz --lzip

      (gzipを解凍)
      $ tar zxvf (対象).tar.gz

      (bzip2を解凍)
      $ tar jxvf (対象).tar.bz2


      ビルド例:
      $ tar xvf gmp-6.0.0.tar.lz --lzip
      $ cd gmp-6.0.0/
      $ mkdir makedir # ビルドするディレクトリを作成
      $ cd makedir
      $ ../configure
      $ make
      $ sudo make install
      $ cd ../..
      $ tar jcvf gmp-6.0.0_made.tar.bz2 gmp-6.0.0/ # make uninstall用にバックアップ
      $ rm -rf gmp-6.0.0/



      次にaptからパッケージのインストールを行います。
        makeに必要になるライブラリ類
      1. bison

      2. flex

      3. zlibg1-dev


      余談ですが、私はここでこれをインストールしてみました。

      $ sudo apt-get install bison flex zlibg1-dev


      では等々GCCのビルドに入ります。
      makeに数時間を要しますのでご注意を。(私は3,4時間程度かかりました)
      なお、configureに渡しているオプションは各々編集してください。
      以下のものは私の例です。
      ビルド対象からJava, Go言語, D言語等外しています。
      $ cd (git cloneしたディレクトリ)
      $ mkdir makedir
      $ ../configure \
      --with-pkgversion='Ubuntu/Linaro 4.9-10ubuntu9' \
      --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs \
      --enable-languages=c,c++,objc,obj-c++ \
      --prefix=/usr \
      --program-suffix=-4.9 \
      --enable-shared \
      --enable-linker-build-id \
      --libexecdir=/usr/lib \
      --without-included-gettext \
      --enable-threads=posix \
      --with-gxx-include-dir=/usr/include/c++/4.9 \
      --libdir=/usr/lib \
      --enable-nls \
      --with-sysroot=/ \
      --enable-clocale=gnu \
      --enable-libstdcxx-debug \
      --enable-libstdcxx-time=yes \
      --enable-gnu-unique-object \
      --enable-plugin \
      --with-system-zlib \
      --disable-browser-plugin \
      --enable-java-awt=gtk \
      --enable-gtk-cairo \
      --enable-java-home \
      --with-arch-directory=amd64 \
      --enable-objc-gc \
      --enable-multiarch \
      --disable-werror \
      --with-arch-32=i686 \
      --with-abi=m64 \
      --with-multilib-list=m32,m64,mx32 \
      --with-tune=generic \
      --enable-checking=release \
      --build=x86_64-linux-gnu \
      --host=x86_64-linux-gnu \
      --target=x86_64-linux-gnu
      $ make
      $ sudo make install
      $ cd ../../
      $ tar jcvf gcc_v4.9_made.tar.bz2
      $ rm -rf gcc


      お疲れさまです!!
      以上でビルドインストールは終了です!
      さてg++あたりの調子を見てみましょうか。
      $ cat << EOF >> Hello.cpp
      #include <iostream>
      int main(){
      std::cout << "Hello World!!" << std::endl;
      }
      EOF

      $ g++-4.9 Hello.cpp
      Hello.cpp:1:20: 致命的エラー: iostream: そのようなファイルやディレクトリはありません
      #include <iostream>
      ^
      コンパイルを停止しました。

      おおっと!! なにか異常が起きているようです。
      あなたの環境でも異常がおきていなければいいのですが…。
      $ g++-4.9 -E -x cpp - -v < /dev/null
      :
      :
      存在しないディレクトリ "usr/include/c++/4.9" を無視します
      存在しないディレクトリ "usr/include/c++/4.9/x86_64-linux-gnu" を無視します
      存在しないディレクトリ "usr/include/c++/4.9/backward" を無視します
      存在しないディレクトリ "/usr/local/include/x86_64-linux-gnu" を無視します
      存在しないディレクトリ "/usr/lib/gcc/x86_64-linux-gnu/4.9.0/../../../../x86_64-linux-gnu/include" を無視します
      #include "..." の探索はここから始まります:
      #include <...> の探索はここから始まります:
      /usr/include/c++/4.9
      /usr/include/c++/4.9/x86_64-linux-gnu
      :
      :

      あらまあ、なぜかC++ヘッダのインクルードパスが相対パス指定になっています。
      どこか間違えたっけ?
      以下暫定的処置。
      $ echo "alias g++='g++ -I/usr/include/c++/4.9 -I/usr/include/c++/x86_64-linux-gnu -std=c++11'" >> ~/.bashrc



      次に[g++-4.9コマンド]でなく[g++コマンド]でg++4.9を使えるように設定します。
      参考サイト様です。
      $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 49



      はい、これであなたはg++4.9を扱うことができます!



      これでg++4.9で扱えなかった<regex>ヘッダも使えるね!!


      追記:
      これだとmake等の場合に失敗しますね。
      こうしましょう。
      $ cd /usr/bin
      $ sudoedit g++-4.9-mod.sh

      (内容)

      #!/bin/sh
      g++ -I/usr/include/c++/4.9 -I/usr/include/c++/4.9/x86_64-linux-gnu $@

      $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9-mod.sh 49

      これで(多分)make時にも対処できます。(できました。)
      あ、ちょっとまってできてないまって!!!


      追記:
      できました。
      $ echo 'export CPLUS_INCLUDE_PATH=/usr/include/c++/4.9:/usr/include/c++/4.9/x86_64-linux-gnu' >> ~/.bash_profile
      としておきましょう。

      そしてg++-4.9にてビルドしたバイナリを実行してみるとlibstdc++.so.6にGLIBCXX_3.4.20がないと言われます。
      $ ./hoge 
      ./hoge: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ./hoge)

      本当に無いのかは以下で確認できます。
      $ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6
      GLIBCXX_3.4
      GLIBCXX_3.4.1
      GLIBCXX_3.4.2
      GLIBCXX_3.4.3
      GLIBCXX_3.4.4
      GLIBCXX_3.4.5
      GLIBCXX_3.4.6
      GLIBCXX_3.4.7
      GLIBCXX_3.4.8
      GLIBCXX_3.4.9
      GLIBCXX_3.4.10
      GLIBCXX_3.4.11
      GLIBCXX_3.4.12
      GLIBCXX_3.4.13
      GLIBCXX_3.4.14
      GLIBCXX_3.4.15
      GLIBCXX_3.4.16
      GLIBCXX_3.4.17
      GLIBCXX_3.4.18
      GLIBCXX_3.4.19
      GLIBCXX_3.4.20
      GLIBC_2.3
      GLIBC_2.2.5
      GLIBC_2.14
      GLIBC_2.17
      GLIBC_2.3.2
      GLIBCXX_DEBUG_MESSAGE_LENGTH

      …ないですね。

      $ strings /usr/lib64/libstdc++.so.6
      GLIBCXX_3.4
      GLIBCXX_3.4.1
      GLIBCXX_3.4.2
      GLIBCXX_3.4.3
      GLIBCXX_3.4.4
      GLIBCXX_3.4.5
      GLIBCXX_3.4.6
      GLIBCXX_3.4.7
      GLIBCXX_3.4.8
      GLIBCXX_3.4.9
      GLIBCXX_3.4.10
      GLIBCXX_3.4.11
      GLIBCXX_3.4.12
      GLIBCXX_3.4.13
      GLIBCXX_3.4.14
      GLIBCXX_3.4.15
      GLIBCXX_3.4.16
      GLIBCXX_3.4.17
      GLIBCXX_3.4.18
      GLIBCXX_3.4.19
      GLIBCXX_3.4.20
      GLIBC_2.3
      GLIBC_2.2.5
      GLIBC_2.14
      GLIBC_2.17
      GLIBC_2.3.2
      GLIBCXX_DEBUG_MESSAGE_LENGTH

      …ありますね。

      ということで、
      これはちょっと危険な行為ですがこうすれば実行時エラーも防げます。
      $ sudo mv libstdc++.so.6 libstdc++.so.6.bak
      $ sudo mv libstdc++.so.6.0.18 libstdc++.so.6.0.18.bak
      $ sudo ln -s /usr/lib64/libstdc++.so.6 .
      $ sudo ln -s libstdc++.so.6 libstdc++.so.6.0.20

      そしてシェルを再読み込み。(exit & シェル再起動)

      以上で多分素敵な最新GCC環境をお楽しみいただけます!
      楽しんでください!!
      僕も楽しむ!!
スポンサーサイト

VimのVundleからNeoBundleへの移行

VundleからNeoBundleへの移行


この記事でわかること

  • Vundleで構築したものと同等の環境をNeoBundleで再現する。

  • NeoBundleの簡単な設定(.vimrc)。


この記事でわからないこと

  • Vundle及びNeoBundleの使い方。

  • 暗黒美夢王の生態系。


VundleからNeoBundleに移行して何が楽しいのか

  • NeoBundleLazyという機能で結果的にVimを高速起動することができる。

  • 色々すごいらしい(かなり)。

  • 「フハハハハ...」





 ではちゃっちゃといきましょうか。
なお「$ なんとか」と書いてあるのはLinuxシェルでの操作です。


 まずvimのベースディレクトリに行きましょう。
そしたらもうvundleで管理していたディレクトリごと削除してしまいましょう。
削除に失敗して環境が修復不可になるのが怖い場合はすべてバックアップしておきましょう。
っとそうだった、何かVimプラグインを魔改造している方はこの時点でバックアップしておいてください。

バックアップ
$ cd
$ cp -r .vim .vim_backup
$ cp .vimrc .vimrc_backup

操作
$ cd ~/.vim
$ rm -rf bundle


じゃあいくぞー。
暗黒美夢王からNeoBundleをいただきます。
またこの時に祈祷してはいけません、美夢王が召喚されてしまいます。
$ git clone https://github.com/Shougo/neobundle.vim.git

設置します。
$ mkdir bundle
$ mv neobundle.vim bundle


これでNeoBundleの設置が完了しました。
次はvimにNeoBundleを認識していただきましょう。
.vimrcを編集します。
僕の場合Vundleの読み込み設定は
source ~/.vim/bundle/vundle/test/minirc.vim
としていましたので、
これを消して
if has('vim_starting')
set runtimepath+=~/.vim/bundle/neobundle.vim
call neobundle#rc(expand('~/.vim/bundle/'))
endif

と書きます。
これはvim起動時に
neobundleの読み込みとプラグインをインストールさせたい場所の指定をする。
ということを設定しています。

では次で大詰め、今までVundleでインストールしたプラグインをNeoBundleでインストールし直します。
これが僕のBundleでのインストール設定の記述です。
Bundle 'basyura/TweetVim'
Bundle 'mattn/webapi-vim'
Bundle 'basyura/twibill.vim'
Bundle 'tyru/open-browser.vim'
Bundle 'h1mesuke/unite-outline'
Bundle 'basyura/bitly.vim'
Bundle 'Shougo/unite.vim'
Bundle 'Shougo/vimproc'
Bundle 'Shougo/vimshell'
Bundle 'rhysd/wandbox-vim'
Bundle 'osyo-manga/quickrun-outputter-replace_region'
Bundle 'vim-scripts/postmail.vim'
Bundle 'yuratomo/gmail.vim'
Bundle 'basyura/J6uil.vim'
Bundle 'osyo-manga/vim-gyazo'
Bundle 'yuratomo/w3m.vim'
Bundle 'mattn/learn-vimscript'
Bundle 'rbtnn/vimconsole.vim'
Bundle 'thinca/vim-quickrun'
Bundle 'tyru/vim-altercmd'
Bundle 'jimsei/winresizer'
Bundle 'add20/vim-conque'
Bundle 'supermomonga/thingspast.vim'
Bundle 'supermomonga/vimshell-kawaii.vim'

これを
NeoBundle 'basyura/TweetVim'
NeoBundle 'mattn/webapi-vim'
NeoBundle 'basyura/twibill.vim'
NeoBundle 'tyru/open-browser.vim'
NeoBundle 'h1mesuke/unite-outline'
NeoBundle 'basyura/bitly.vim'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/vimproc'
NeoBundle 'Shougo/vimshell'
NeoBundle 'rhysd/wandbox-vim'
NeoBundle 'osyo-manga/quickrun-outputter-replace_region'
NeoBundle 'vim-scripts/postmail.vim'
NeoBundle 'yuratomo/gmail.vim'
NeoBundle 'basyura/J6uil.vim'
NeoBundle 'osyo-manga/vim-gyazo'
NeoBundle 'yuratomo/w3m.vim'
NeoBundle 'mattn/learn-vimscript'
NeoBundle 'rbtnn/vimconsole.vim'
NeoBundle 'thinca/vim-quickrun'
NeoBundle 'tyru/vim-altercmd'
NeoBundle 'jimsei/winresizer'
NeoBundle 'add20/vim-conque'
NeoBundle 'supermomonga/thingspast.vim'
NeoBundle 'supermomonga/vimshell-kawaii.vim'

とする。
そう、BundleにNeoをつけるだけ!

あとは
:NeoBundleInstall
するだけです!

これでNeoBundleな環境に移行されました!!
やったね。


設定の全体さん。
" プラグインマネージャーの設定ファイルを読み込み
if has('vim_starting')
set runtimepath+=~/.vim/bundle/neobundle.vim
call neobundle#rc(expand('~/.vim/bundle/'))
endif

"*** プラグイン管理 ***"

NeoBundle 'basyura/TweetVim'
NeoBundle 'mattn/webapi-vim'
NeoBundle 'basyura/twibill.vim'
NeoBundle 'tyru/open-browser.vim'
NeoBundle 'h1mesuke/unite-outline'
NeoBundle 'basyura/bitly.vim'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/vimproc'
NeoBundle 'Shougo/vimshell'
NeoBundle 'rhysd/wandbox-vim'
NeoBundle 'osyo-manga/quickrun-outputter-replace_region'
NeoBundle 'vim-scripts/postmail.vim'
NeoBundle 'yuratomo/gmail.vim'
NeoBundle 'basyura/J6uil.vim'
NeoBundle 'osyo-manga/vim-gyazo'
NeoBundle 'yuratomo/w3m.vim'
NeoBundle 'mattn/learn-vimscript'
NeoBundle 'rbtnn/vimconsole.vim'
NeoBundle 'thinca/vim-quickrun'
NeoBundle 'tyru/vim-altercmd'
NeoBundle 'jimsei/winresizer'
NeoBundle 'add20/vim-conque'
NeoBundle 'supermomonga/thingspast.vim'
NeoBundle 'supermomonga/vimshell-kawaii.vim'

filetype plugin indent on

"**********************"

公開物一覧

ゲーム(Windows向け | DXライブラリ)

わたし、殲滅します☆
- 右から左へ移りゆく敵を撃ち、
ポイントで武器を購入したりする30秒ゲー


ユーティリティ(Windows向け)

CSV_e-learning_System
- 名前変えたいCSVでテストを作ることができるソフトウェア


コンソールアプリケーション(*NIXシェル向け)

AWorkLog_Diary
- ワークログツール


Vim script(Vim)

arot13.vim
- Vim向けRot13プラグイン


身内向け

C++テンプレートメタプログラミング入門資料

[screen + VimShell + Vimタブ機能]のすすめ

[screen + VimShell + Vimタブ機能]のすすめ
 現在私のターミナル環境は
GnomeTerminal(Ubuntu) -> screen + vim
で運用しています。

 この記事には以下の方々に効能があります。
・各プログラミング言語(各分野)の作業を同時に行う
・screenの複数ターミナルじゃもの足りない ( Prefix + c )
・既存の環境に刺激が欲しい

なお、筆者Vim使いのためVim前提で話をすすめますが、
Emacserの方々にはeshellや
tabbar.el等のプラグインで読み替えることが可能かと思います。


インストールが推奨されるソフトウェア
Vundle(Vimプラグインを統括管理)
VimShell

インストールが必要なもの
GNU screen
・Vim


 私はしばしばC++を書きながらツイッターをしつつHaskellを学んでみたり
ソフトウェアのインストールをしながらワークログを書いて、
関数電卓の代わりにJavaコードで計算したり…ということをします。

 でもその時にscreenの複数ターミナルを開く機能ではもの足りない場合があるのですよね…。
なぜなら

「いちいち各言語ごとにいくつもターミナルを開いているとターミナルがいっぱいになるから」

!!

ですのでもっとコンパクトでスマートにできないかと思っていました。


// 以下、記事書き途中。
// この記事書くの放置してた間にscreenからtmux派になった。

VimShellCreate
欠点
gccとかでコンパイルとかすると、コンパイルエラーが血のように赤くそして激しく降り注ぐのでこわい。

C++の知らなかったこと。

C++の知らなかった機能(規格)をひたすら列挙していきます。



char* str =
"line1"
"line2"
"line3";

これで"line1line2line3"という文字列になる。
もちろんstd::stringでもできます。
const char* STR = "line2";
char* str =
"line1"
STR
"line3";

これは不可、定数であれリテラル以外が絡むとだめらしい。

 恥ずかしいことに今までこうしてました(笑)。
const std::string STR = std::string() +
"line1" +
"line2" +
"line3";

(某中3女子さんありがとうございます!)

こういうのもできるみたい。
std::string str =
"line1\
line2\
line3";

=> "line1line2line3"

なお、これにインデント入れたりすると
std::string str =
"line1\
line2\
line3";

=> "line1 line2 line3"
こうなります…。


ところで、streamのoperator<<もしくはoperator>>以外の関数を呼び出すと、
バッファがおかしくなりません?
std::cout << "please input char: ";
char c = std::cin.get();
std::string str;
std::cout << "please input str: ";
std::cin >> str;
std::cout << "output: " << std::endl
<< c << std::endl
<< str << std::endl;

please input char: aaa
please input str: // スルーされる。
output:
a
aa

っていう。


------------------------------

C++で配列オブジェクト


Cのベターな配列受け渡し方法…こうですね。
void func(int* a, const int len){
int i;
for(i=0; i<len; i++)
a[i] = i;
}
int main(){
const int LEN = 5;
int a[5];
func(a, LEN);
}

こわい。
なにこれ怖いです。
C++11でこんなことをするわけにはいかないのです!!
ってことで…std::vector使っちゃう?
まって!! それ可変長だよ!!

ってことで…ちゃんとC++11なら固定長な配列オブジェクトが用意されていたんですね…。
<tr1/array>ヘッダstd::tr1::array<T,size>です!!
先ほどの例にならって書いてみましょう。
#include <tr1/array>
template <typename T, int size>
void func(std::tr1::array<T,size> a){
for(T i=0; i<size; i++)
a[i] = i;
}
auto main() -> int {
constexpr int LEN = 5;
std::tr1::array<int,LEN> a;
func<int,LEN>(a);
}

C++11きたこれっ!!
------------------------------
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。