为Raspberry Pi交叉编译C ++ 11代码

时间:2013-04-14 21:01:10

标签: cross-compiling raspberry-pi

我正在尝试将一个大型项目移植到Raspberry Pi,这个项目大量使用了C ++ 11的功能。该项目使用CMAKE,我使用crosstool-ng进行交叉编译。我在Pi上安装了依赖项并在本地复制它们,我设法让CMAKE找到它们。一些代码正确构建并生成ARM输出。但是,大多数代码都因令人困惑的GCC输出而失败,我非常肯定与C ++ 11 /模板支持有关。例如,我得到这样的错误:

  • error: 'mutex' in namespace 'std' does not name a type(有问题的文件包含< thread>如果我还包含< mutex>,而不是x86 Ubuntu的要求,则此错误会消失)

  • error: expected class-name before '{' token({是:template<typename _Res> class __basic_future : public std::__future_base之前的行

  • error: '__result_type' does not name a type(由于上述错误,可能会发生这种情况)

这些错误看起来像ARM g ++编译器不太喜欢模板。正在使用的g ++版本是arm-unknown-linux-gnueabi-g++ (crosstool-NG 1.18.0) 4.7.3 20130102 (prerelease)

有人能指出我正确的方向吗?

编辑:以下是ps中其中一个文件的g ++外观:

arm-unknown-linux-gnueabi-g++ -DprojectCore_EXPORTS -fPIC
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include/freetype2
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include/glib-2.0
-I/home/sagar/workspace/RaspberryPi/target_env/usr/lib/arm-linux-gnueabihf/glib-2.0/include
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include/gdk-pixbuf-2.0
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include/gtk-2.0
-I/home/sagar/workspace/RaspberryPi/target_env/usr/lib/arm-linux-gnueabihf/gtk-2.0/include
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include/cairo
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include/pango-1.0
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include/atk-1.0
-I/home/sagar/workspace/RaspberryPi/target_env/usr/local/include
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include/eigen3
-I/home/sagar/workspace/RaspberryPi/target_env/usr/include/flann
-I/home/sagar/workspace/project/include -std=c++0x -Wall -Werror -Wno-deprecated -fPIC -g -O4
-o CMakeFiles/projectCore.dir/src/project/Core/Memory/Array2D.C.o -c /home/sagar/workspace/project/src/project/Core/Memory/Array2D.C

2 个答案:

答案 0 :(得分:2)

我认为唯一的事情是:

  • -std=c++0x param设为g++ compiler
  • link pthread(-lpthread
  • 您必须确保正在为armv6
  • 进行编译

答案 1 :(得分:1)

首先让我说我不确定此错误的修复方法。但是我在RPi中使用C ++处理大型图像处理代码时遇到了类似的错误。我无法通过及时安装所有依赖项来修复它。相反,我最终将整个代码移动到运行windows server edition / windows 7代码的云,它编译得很好。如果您有时间限制,只需解决方法!