make -j 8 g++: 内部编译器错误:被终止(程序 cc1plus)

88

当我在Ubuntu12.04上部署Apache Mesos时,我按照官方文档进行操作,在“make -j 8”步骤中,在控制台中出现以下错误:

g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.9/README.Bugs> for instructions.
make[2]: *** [slave/containerizer/mesos/libmesos_no_3rdparty_la-containerizer.lo] Error 1
make[2]: *** Waiting for unfinished jobs....
mv -f log/.deps/liblog_la-log.Tpo log/.deps/liblog_la-log.Plo
mv -f slave/containerizer/.deps/libmesos_no_3rdparty_la-docker.Tpo slave/containerizer/.deps/libmesos_no_3rdparty_la-docker.Plo
mv -f log/.deps/liblog_la-consensus.Tpo log/.deps/liblog_la-consensus.Plo

mv -f slave/containerizer/.deps/libmesos_no_3rdparty_la-external_containerizer.Tpo slave/containerizer/.deps/libmesos_no_3rdparty_la-external_containerizer.Plo
mv -f log/.deps/liblog_la-coordinator.Tpo log/.deps/liblog_la-coordinator.Plo
mv -f slave/.deps/libmesos_no_3rdparty_la-slave.Tpo slave/.deps/libmesos_no_3rdparty_la-slave.Plo
mv -f master/.deps/libmesos_no_3rdparty_la-master.Tpo master/.deps/libmesos_no_3rdparty_la-master.Plo
make[2]: Leaving directory `/root/Mesos/mesos/build/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/root/Mesos/mesos/build/src'
make: *** [all-recursive] Error 1

我该怎么办?


4
恭喜你发现了编译器中的一个漏洞。请考虑按要求提交错误报告... - nneonneo
4
@nneoneo,确实如此。当他问,“我该怎么办?”时,我相信他是指,“...让它工作起来?”我建议运行“make -j 8 VERBOSE=1”,只是为了看看g++命令行上是否有任何不符合您期望的内容。如果你幸运的话,你会找到一个关于下一步的线索。 - donjuedo
6
同时,去掉"-j 8"。这只是让make并行构建,没有使任何东西更清晰易懂。 - Gil Hamilton
13
尝试使用“make -j 2”。也许你没有足够的RAM来支持“-j 8”,因此编译过程可能会遇到臭名昭著的内存超额承诺问题(在你的机器上应该禁用它)。 - Basile Starynkevitch
3
@pugna 首先,如我之前建议的那样,去掉 -j 8,因为 @BasileStarynkevitch 上面指出了原因。其次,在 stackoverflow 的评论中提交您的错误报告不会对您或任何其他人有所帮助。请前往 https://gcc.gnu.org/bugs/。 - Gil Hamilton
显示剩余8条评论
4个回答

159

在故障后立即尝试运行dmesg

您是否看到了这样一行内容?

Out of memory: Kill process 23747 (cc1plus) score 15 or sacrifice child
Killed process 23747, UID 2243, (cc1plus) total-vm:214456kB, anon-rss:178936kB, file-rss:5908kB

很可能这是您的问题。运行make -j 8会运行许多使用更多内存的进程,当系统内存不足时会出现上述问题。在这种情况下,操作系统会运行一个进程来评分系统中的每个进程,得分最高的进程将被操作系统杀死以释放内存。如果被杀死的进程是cc1plus,则gcc(可能不正确地)将其解释为进程崩溃,因此认为这必须是编译器错误。但实际上并非如此,问题是操作系统杀死了cc1plus,而不是它崩溃。

如果是这种情况,请尝试运行make -j 4。这意味着并行作业较少,编译时间将更长,但希望不会耗尽系统内存。


谢谢,dmesg 显示错误。看起来 j4 将会出现 内存不足 的问题。 - SAMPro
我也遇到了同样的错误 - 即使使用-j 1选项。帮助我的方法是关闭另一个不必要的进程,它占用了大量的内存。 - manish ma
谢谢。在我的情况下,这就是原因。已点赞。 - Manoj I

54

(可能是内存问题)

对于那些仍然遇到此问题的人(在问题被提出2年后),此处有一个技巧来解决它。

为了方便起见,我在此粘贴:

运行以下命令(根据需要调整bs=count=):

  • sudo dd if=/dev/zero of=/swapfile bs=64M count=16
  • sudo mkswap /swapfile
  • sudo swapon /swapfile

这应该可以让您编译代码。但是请确保在编译之后使用以下命令恢复swapon

  • sudo swapoff /swapfile
  • sudo rm /swapfile

很遗憾,OpenVZ VPS服务器的用户受到了限制。这个“技巧”行不通。交换技术对于单个VPS不可用,只适用于主系统 :-( - PYK
3
这只添加了64*16 = 1024 MB 的交换空间,不算很多。我的编译需要8 GB,如果有足够的空间,为什么不设置bs=1G呢? - Jimmy Pettersson

20

通过键入以下命令检查您的CentOS安装是否已启用交换分区:

swapon --show
sudo swapon --show

如果输出为空,则意味着您的系统未启用交换空间。

创建交换文件

1.创建一个文件,该文件将用作交换空间。bs 是一个块的大小。count 是块数。它将获得 1024K * 1M = 1G 空间。

sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576

2.确保仅 root 用户可以读取和写入交换文件:

sudo chmod 600 /swapfile

3.在文件上设置 Linux 交换区域

sudo mkswap /swapfile

4.激活交换

sudo swapon /swapfile

5. 使用"sudo swapon --show"或"sudo free -h"命令,您将看到交换空间。


2

这是我在AWS EC2实例上编译CentOS 7的过程中遇到的问题。

我通过将内存和CPU至少增加到4GiB和2个vCPUs来解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接