llvm编译失败几句话总结


这里就不重复说LLVM编译的方法了,网上一大堆。(直接看官方文档是最好的)

单说大概的问题和解决方法。

 

等等!说之前先插一句:如果你跟我一样是为了种种原因第一次折腾,那还是不要自己编译了,llvm官网有pre-build版本的,直接下下来然后在linux环境变量里面添加路径直接用就好了,这个网上也有说,这里就不讲了

 

但是如果需要调试,那还是要编译debug版本,那就没办法了,按照网上教程折腾吧

出错了 直接百度报错信息进行排查,如果所有的问题都排查了(报错信息都解决了),还是编译失败,那在make(或者ninja)的时候,少用-j(我试过用服务器编译,直接-j128,并没有快多少),不过用不用多线程编译属于玄学的解决问题方式了,这个方法优先度比较低,还是优先从问题出在别的地方来考虑比较好。

 

大部分时候,编译失败都是因为这三点:

1.缺少依赖的软件

解决方法,去官网,把上面提到的所有软件全部装了

https://llvm.org/docs/GettingStarted.html#checkout

2.磁盘不够大

llvm是真的编译出来超大,直接虚拟机磁盘拉到200G,就不用考虑这个问题了(亲测llvm9.0.1版本debug编译,只加clang,编译出来61G)

3.内存不够

这个点我是真的没想到的,等了半天以为编译好了,进去一看发现报错

c++: internal compiler error: Killed (program cc1plus)

一查发现是内存不足,直接吐了

2G内存不够你吃的海星,想当年我开kali只分给500m的

奈何本人电脑只有8G,遂关掉虚拟机,内存拉到5G再来

然后就看到内存占用几秒的时间里一下从21%飙到87%

好的是我输了,垃圾电脑不配编llvm

后面还一度升到97%,然后又报错了,(5G都不够你吃的wtf)然而我的内存条已经一滴都没有了。所以物理机内存不够的同学还是加个swap分区吧,参考下面链接

http://xwsoul.com/posts/684


 gcc 编译出现 internal compiler error: Killed

internal compiler error: Killed (program cc1plus)

在 640M 内存的 vps 做编译的时候出现了上述错误.
几经搜索, 才发可能是系统没有交换分区, 编译过程中内存耗尽, 导致了编译中断 …
解决方式也很简单, 就是增加一个交换分区:

1. 创建分区文件, 大小 2G

dd if=/dev/zero of=/swapfile bs=1k count=2048000

2. 生成 swap 文件系统

mkswap /swapfile

3. 激活 swap 文件

swapon /swapfile

这样就木有问题了, 但是这样并不能在系统重启的时候自动挂载交换分区, 这样我们就需要修改 fstab.
修改 /etc/fstab 文件, 新增如下内容:

/swapfile  swap  swap    defaults 0 0

这样每次重启系统的时候就会自动加载 swap 文件了.

同时,如果系统默认设置得很小,需要加上命令,使得系统积极使用交换内存

sudo sysctl vm.swappiness=100


就这几点了,写的很简略,对于别人来说可能没有解决问题的参考价值,也就是我个人发发牢骚而已。从今年年初开始到现在我一共出现了3次需要编译llvm的情景,每次都会出现各种玄学问题卡我至少一天以上。。。心累啊

 

再次补充,我以为可以了,结果还剩1/3还是报错,这次的错误又不一样了,先放张图

 

 可以看到错误是这个

collect2: fatal error: ld terminated with signal 9

经过查阅,居然有前辈也是编译llvm的时候遇到了这个错误并且解决了,是下面这个链接

https://blog.csdn.net/vincentuva/article/details/83111447

我往下一看,果然还是内存分配不足的问题。。。

直接分20G!就不信你20G都能吃掉

未完待续。。。。。

9.5早上:一晚上过去了,还剩十分之一的文件没编译完,我真是¥&%&

看了下在编译clang9,查了下这个文件编译出来估计有2.7G这么大,因为debug编译有很多符号,行吧。。。

终于编译完了。总结经验,我个人的编译,物理机8G内存条,分了4G给虚拟机(试过给5G,会崩所以还是4G好一点),然后交换分区给了25G,实际观察最高能吃掉15G多一点左右。然后ninja -j最好能单线程编译就单线程,慢点是慢点,但是至少不会崩或者卡住。