2013-04-21 114 views
5

我正在嘗試爲Raspberry Pi交叉編譯一個大型項目。我正在使用由crosstool-ng,gcc版本4.7.3構建的工具鏈。當它看到std :: shared_future時編譯扼流圈。我得到這個錯誤:樹莓派工具鏈上的std :: shared_future

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

及這裏的生成錯誤的源文件:

#include <future> 

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

這同一個源文件編譯成功的Rapsberry皮本身。這是一個crosstool工具鏈中的錯誤嗎?有沒有解決方法?我怎樣才能成功編譯?

+0

你確定正確的標誌被傳遞給編譯器嗎?你有沒有任何C++ 11的支持? – Thibaut 2013-04-21 17:27:16

+1

你可以得到'std :: future','std :: async'或'std :: thread'來編譯嗎? – juanchopanza 2013-04-21 17:30:42

+0

對不起,忽略了我以前的評論,我剛剛意識到如果C++ 11根本就不存在,編譯器會抱怨include。 – Thibaut 2013-04-21 17:32:52

回答

2

我解決了這個問題,來自@backlash和Freenode上#gcc的人。 Crosstool-NG正在構建armv7的工具鏈,而Raspberry Pi的編譯器正在編譯armv6。將「架構級別」(目標選項>體系結構級別)更改爲armv6允許我編譯我原始問題中發佈的示例代碼。此選項將--with-arch=armv6添加到gcc的配置標誌。希望這可以幫助未來的人。

3

要有shared_future實現類,而不只是向前聲明,您必須等於真正下列條件預處理:#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) && (ATOMIC_INT_LOCK_FREE > 1)

根據你以前的答案@juanchopanza,看來你有下面的部分該條件等於true:if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1),因爲它實際上是thread類的實現。

最後,我們可以說這部分條件是錯誤ATOMIC_INT_LOCK_FREE > 1

+1

爲什麼它不是真的?是否有我應該通過的編譯器標誌?請注意,相同的代碼在rPi上編譯。 – sagargp 2013-04-22 01:42:02

+2

它似乎是你的本地編譯器和交叉編譯器之間的差異,所以你應該嘗試找出他們不同意的原因。 – 2013-04-22 12:16:36

+2

'ATOMIC_INT_LOCK_FREE> 1'可能是在生成crosstool-ng期間錯誤配置的錯誤原因。所以我認爲你應該使用'ATOMIC_INT_LOCK_FREE> 1'的配置來重建你的工具鏈,但我不知道如何。 – backlash 2013-04-22 12:39:41