這里就不重復說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最好能單線程編譯就單線程,慢點是慢點,但是至少不會崩或者卡住。