読者です 読者をやめる 読者になる 読者になる

WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

Raspberry Pi2でC++さんを動かしてみる

C-PlusPlus Raspberry Pi

こんにちは。今回ブログを担当する長屋です。
ついに巷で話題の「Raspberry Pi2」を購入しました。
今回は「Raspberry Pi2」上でC++ソースのコンパイルから実行までやってみたいと思います。

-Raspberry Pi2-
https://www.raspberrypi.org/products/raspberry-pi-2-model-b/

Raspberry Pi2 環境
・OS Raspbian (wheezy)
・32GB SDカード
※SSH接続で遠隔操作してます。

以下の様なソースを準備しました。
「dev/test.cpp」

#include <iostream>  
#include <array>  
#include <algorithm>  
  
using namespace std;  
  
int main()  
{  
    cout <<"Hello! Raspberry Pi!\n";  
  
    array<int,4> test = {1,2,3,4};  
  
    for (const auto & num : test)  
    {  
        cout << num <<"\n";  
    }  
  
    //偶数の値を数える  
    auto res = count_if(test.begin(),test.end(),[](int n){return n % 2 == 0;});  
  
    cout <<"偶数の数= " << res << "\n";  
    return 0;  
}  
  

以下のコマンドを実行してコンパイルします。

pi@raspberrypi ~/dev $ g++ test.cpp

〜コンパイル結果〜
In file included from /usr/include/c++/4.6/array:35:0,from test.cpp:2:/usr/include/c++/4.6/bits/c++0x_warning.h:32:2:
error: #error This file requires compiler and liary support for the upcoming ISO C++ standard,
C++0x.This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.


コンパイルが通らずエラーが吐かれてしまいました。
どうやら最初から入っている「GCC4.6」では「C++11」には対応していないみたいです。
仕様確定前の「C++0x」は対応してるみたいですが・・・。

折角なので「C++11」に対応しているバージョンに更新したいと思います。

コンパイラの更新

以下のコマンドを実行して更新可能なバージョンを探します。

pi@raspberrypi ~ $ apt-cache search 'g++'|grep ^g++

〜実行結果〜
image02

最新版である「g++-4.8 - GNU C++ compiler」では「C++11」を正式にサポートしているみたいです。
以下のコマンドを実行して最新版をインストールします。

pi@raspberrypi ~ $ sudo apt-get install gcc-4.8 g++-4.8

インストール完了後、再度コンパイルをかけてみます。
「C++11」でコンパイルする場合は「-std=c++11」を付けます。

pi@raspberrypi ~/dev $ g++ -std=c++11 test.cpp

~実行結果~
cc1plus: error: unrecognized command line option ‘-std=c++11’

再びエラーが吐かれてしまいました・・・。
そもそも「-std=c++11」が識別子として認識されていないようです。
バージョンを確認するために以下のコマンドを実行します。

pi@raspberrypi ~/dev $ g++ --version

〜実行結果〜
image04

古いバージョンの物が設定されていました。
[4.6]と[4.8]が共存している状態なので優先順位を設定するために以下のコマンドを実行します。

pi@raspberrypi ~ $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 10  
pi@raspberrypi ~ $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20

この2つのコマンドを実行後、再度バージョンを確認してみます。
image06

無事、[4.8]が使用されるようになりました。
三度目の正直でコンパイルをかけてみます。

pi@raspberrypi ~/dev $ g++ -std=c++11 test.cpp

コンパイルに成功すると「a.out」という実行ファイルが吐出されています。
image07

実際に以下のコマンドで実行してみます。

pi@raspberrypi ~/dev $ ./a.out

〜実行結果〜
image09

無事コンパイラの更新からコンパイル。実行まで出来ました。

「C++14」は...?
「Debian」の次期メジャーリリースである「jessie」では「GCC4.9」がインストールされます。
「Raspberry Pi」のOSである「Raspbian」は「Debian」を最適化したもなので、パッケージをそのまま扱うことができます。
「GCC4.9」ではC++14の一部機能が利用できるようになっているようです。
折角なのでこちらも動かしてみたいも思います。

※「jessie」はまだ正式リリースされていないものです。安定版ではありません。

1.パッケージリストを更新してアップグレードします

pi@raspberrypi ~ $ sudo apt-get update  
pi@raspberrypi ~ $ sudo apt-get upgrade

2.以下のファイルを編集して「wheezy」を「jessie」へ書き換え保存します

path = /etc/apt/sources.list  
deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi  

3.再度パッケージリストを更新します

pi@raspberrypi ~ $ sudo apt-get update

パッケージリストが更新されたので再びC++コンパイラの更新リストを検索します。

pi@raspberrypi ~ $ apt-cache search 'g++'|grep ^g++

〜実行結果〜
image03

g++-4.9 - GNU C++ compiler」が新しく追加されています

4.「GCC4.9」をインストール後、優先順位を設定します

pi@raspberrypi ~ $ sudo apt-get install gcc-4.9 g++-4.9  
pi@raspberrypi ~ $ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 30

「C++14」の新機能であるジェネリックラムダを用いたソースをコンパイルしてみます。
「dev/test14.cpp」

#include <iostream>  
  
using namespace std;  
  
//パラメータパック展開用のメソッド  
void print ()  
{  
    cout << endl;  
}  
  
template <typename T,typename ...Types>  
void print (T head, Types... tail)  
{  
    cout << head << endl;  
    print(tail...);  
}  
  
int main()  
{  
    //ジェネリックラムダ式  
    auto lamda = [](auto head,auto...tail)  
    {  
        print(head,tail...);  
    };  
  
    lamda("Hello!","Raspberry Pi!",12,29,32);  
  
    return 0;  
}  

以下のコマンドでコンパイル後実行します。
「C++14」なので「-std=c++14」と付けます。

pi@raspberrypi ~/dev $ g++ -std=c++14 test14.cpp  
pi@raspberrypi ~/dev $ ./a.out  

〜実行結果〜
image11

C++14のソースをコンパイルから実行まで出来ました。
直接コンパイラを叩くことはあまり無かったのでもっと奥まったところまで触って行きたいです
次回も再び「Raspberry Pi2」を触って行きたいと思います。