2013-04-21 1 views
5

ラズベリーパイの大きなプロジェクトをクロスコンパイルしようとしています。私はcrosstool-ng、gccバージョン4.7.3で構築されたツールチェーンを使用しています。コンパイルはstd :: shared_futureを見るとチョークします。私はこのエラーを取得する:ラズベリーパイツールチェーンのstd :: shared_future

#include <future> 

int main() 
{ 
    std::shared_future<int> xxx; 
    return 0; 
} 

ファイルがRapsberryパイ自体に正常にコンパイルこれと同じソース:

test.cpp:5:27: error: aggregate 'std::shared_future<int> xxx' has incomplete type and cannot be defined 

そして、ここではそのエラーを生成したソースファイルです。これはクロスツールツールチェーンのバグですか?回避策はありますか?これをどのようにしてコンパイルするには?

+0

コンパイラに適切なフラグが渡されていますか? C++ 11のサポートはまったくありますか? – Thibaut

+1

'std :: future'、' std :: async'、 'std :: thread'をコンパイルすることができますか? – juanchopanza

+0

申し訳ありませんが、私の前のコメントを無視して、私はちょうど、コンパイラがC++ 11がまったく存在しなかった場合にインクルードについて不平を言うことに気付いた。 – Thibaut

答えて

2

私はこの問題を@backlashの助けとFreenodeの#gccの人々によって解決しました。 Crosstool-NGはarmv7のツールチェーンを構築していましたが、Raspberry Piのコンパイラはarmv6のためにコンパイルしていました。 "アーキテクチャレベル"(対象オプション>アーキテクチャレベル)をarmv6に変更すると、私の元の質問に投稿されたサンプルコードをコンパイルすることができました。このオプションはgccの構成フラグに--with-arch=armv6を追加します。これが将来誰かを助けてくれることを願っています。

3

shared_future実装クラスだけでなく、前方宣言を持っているために、あなたがtrueに等しい次のプリプロセッサの条件を持っている必要があります。#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) && (ATOMIC_INT_LOCK_FREE > 1)

は@juanchopanzaにあなたの前の回答によると、あなたが以下の部分を持っているようですtrueの場合はとなり、実装にはthreadクラスが必要です。

最終的に、条件のこの部分は偽であると言えるでしょうATOMIC_INT_LOCK_FREE > 1

+1

なぜそれは真実ではないでしょうか?私は渡すべきコンパイラフラグはありますか?同じコードがrPi自体でコンパイルされることに注意してください。 – sagargp

+2

あなたのネイティブコンパイラとクロスコンパイラの違いがあるようですので、なぜ彼らが同意しないのかを調べるべきです。 –

+2

'ATOMIC_INT_LOCK_FREE> 1'は、クロス生成時に不正な構成のために誤っている可能性があります。ですから、あなたは 'ATOMIC_INT_LOCK_FREE> 1 'を作る設定であなたのツールチェーンを再構築すべきだと思います。 – backlash