エンジニア

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

投稿日:2015年4月10日 更新日:

こんにちは。今回ブログを担当する長屋です。
ついに巷で話題の「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」を触って行きたいと思います。

採用情報

ワンダープラネットでは、一緒に働く仲間を幅広い職種で募集しております。

-エンジニア
-,

© WonderPlanet Inc.