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最好能单线程编译就单线程,慢点是慢点,但是至少不会崩或者卡住。