【问题标题】:Cross-compiling C++11 code for Raspberry Pi为 Raspberry Pi 交叉编译 C++11 代码
【发布时间】:2014-01-20 17:41:48
【问题描述】:

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

  • error: 'mutex' in namespace 'std' does not name a type(相关文件包含 ,如果我还包含 ,则此错误消失,这在 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

【问题讨论】:

  • @BartekBanachewicz 我添加了为其中一个文件生成的 g++ 命令。 -std=c++0x 在那里,我认为这与 c++11 相同。
  • 好吧,std::mutex 应该在<mutex>(或so it says here)中定义,所以我认为这不是一个错误 - 如果有什么错误是 x86 版本包含你的标题没有要求,但我不记得在多大程度上允许。但是添加它不会破坏x86吗?你有#included <future> 给其他人吗?
  • @Rup 关于包括的好点...虽然<thread> 包括<mutex>,我认为这在x86 构建中通过。不过,我不介意添加所需的包含作为解决方案。包括<future> 并没有解决其他问题。它似乎不喜欢template<typename _Res> class __basic_future : public std::__future_base 作为类声明,但没有说为什么不。
  • 您解决了这个问题吗?
  • @ChristianRapp 我解决了我在另一个线程中遇到的另一个相关问题,该解决方案也可能适用于此。 stackoverflow.com/questions/16133977/…

标签: cross-compiling raspberry-pi


【解决方案1】:

我认为唯一的事情是:

  • -std=c++0x参数设置为g++ compiler
  • 链接 pthread (-lpthread)
  • 您必须确定您正在为armv6 进行编译

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2020-11-16
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多