2013-04-21 111 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