【问题标题】:internal compiler error: Segmentation fault On Raspberry Pi内部编译器错误:Raspberry Pi 上的分段错误
【发布时间】:2018-06-24 08:58:33
【问题描述】:

尝试在 Raspberry Pi 上构建 OpenCV 3.3.0 时,我不断遇到编译器级别的分段错误。我正在按照指南 here 构建优化的 OpenCV 库。

cmake 步骤工作得非常好,但是当我尝试运行make -j4 时,编译器会出现一些分段错误。

【问题讨论】:

  • 每次都发生在同一个文件上吗?编译器会在段错误之前打印错误吗?系统是否有足够的资源同时运行多个编译器,还是内存不足导致错误?是否有可用于修复崩溃的编译器的更新(您使用的是哪个编译器)?
  • 它在构建过程的不同点的不同文件上 - 有人在下面提到这是由于内存不足,根据我的经验这是有道理的。奇怪的是没有OOM错误,而只是段错误。
  • 您可能还想增加交换文件的大小,默认情况下只有 100MB。编辑 /etc/dphys-swapfile/sbin/dphys-swapfile 以增加最大允许大小,例如至 4GB (4096) 或 8GB (8192)。然后重启phys-swapfile服务或者重启。

标签: c++ linux opencv raspberry-pi


【解决方案1】:

这个问题的解决方案最终与使用多个作业有关。我仍然不能 100% 确定原因是什么,但是在运行带有 -j2 标志而不是 -j4 标志的 make 命令时,它编译得非常好,尽管速度要慢得多。我认为这可能来自在资源稀疏的机器上运行时出现的内存分配错误。

#Fixed command:
make -j2

编辑:修改文本以更准确地描述 -j 标志的作用。

【讨论】:

  • make 的工作和线程无关。 make 创建进程,而不是线程。
  • make-j 标志用于启动多个parallel build processes。 Rasperry Pi 的内存相当小(与现代普通 PC 相比),编译可能会占用大量内存,因此尝试启动许多进程可能会耗尽内存,从而导致段错误(取决于当前负载等)。如果你打算为你的 Raspberry 编译很多东西,你可以查看cross compiling
  • 感谢大家的反馈! @jdehesa,你知道为什么它会出现段错误而不是出现某种 OOM 错误吗?
  • @rreichel 在 Linux 上,每个动态内存分配(在这种情况下由编译器分配)最后都是一个 malloc。当没有可用内存时,该函数会返回一个地址,该地址在使用时会出现段错误。有关此行为的进一步说明,请参阅 this question
【解决方案2】:

您好,我在 Xavier NX 上的 xtensor 库遇到了类似的问题。 gcc 的版本是 7.5.0 。在我切换到 gcc 版本 8.4.0 后,内部编译器错误消失了。

这里是在多个 gcc 版本之间切换的教程:

https://linuxconfig.org/how-to-switch-between-multiple-gcc-and-g-compiler-versions-on-ubuntu-20-04-lts-focal-fossa

最好的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多