1. 程式人生 > >YouCompleteMe入坑指南

YouCompleteMe入坑指南

YouCompleteMe vim glibc

本文記錄自己安裝YouCompleteMe(簡稱YCM)這款VIM插件的過程,主要目的是記錄出錯情況和解決方法。

YCM號稱史上最難裝vim插件,根據我的安裝經驗,此言不虛。得知其強大之時,我便不假思索開始安裝。

我所用的系統為CentOS6.8,幾年前裝的,比較老,沒想到這個的老系統差點要了我的老命。在網上找到了幾篇安裝經驗文章:
https://www.jianshu.com/p/d908ce81017a?nomobile=yes
https://www.linnuxidc.com/Linux/2017-10/147825.htm

以及YCM官網:https://github.com/Valloric/YouCompleteMe

坑一:vim版本。系統自帶vim為7.3版本,YCM需要7.4.1578以上,好吧,升級到8.0.

坑二:libpython2.7.so. 根據網上的一篇文章指示,編譯安裝YCM時,使用./configure --prefix=/usr/local --path 時需要指定Python解釋器路徑,也就是python2或python3只能支持一個。我的系統中既有2也有3,我選擇指向python2.7的路徑。沒想到執行configure時報錯:
“找不到動態鏈接庫,只找到表態庫?”
手動查找了一下:
[root@localhost]# which python
/usr/bin/python
[root@localhost]# which python2.7

/usr/local/bin/python2.7
[root@localhost]# locate libpython2.6.so
/usr/lib64/libpython2.6.so
/usr/lib64/libpython2.6.so.1.0
/usr/lib64/python2.6/config/libpython2.6.so
[root@localhost]# locate libpython2.7.so
[root@localhost]#
可以看到系統中只有libpython2.6的動態鏈接庫,而沒有libpython2.7。這是為什麽呢?原來我在編譯安裝python2.7配置時沒有加上--enable-shared參數,只有加上此參數才會生成動態鏈接庫,否則只會生成靜態鏈接庫。
stackoverflow上有個貼子可以參考:
https://stackoverflow.com/questions/26597527/how-to-install-libpython2-7-so

坑三:C-family support. 如果要安裝c語言家族支持,在運行install.py時需要加參數--clang-completer, 但是安裝c支持又需要一大堆依賴包,so...謹慎選擇哦。在這裏出過的錯我記不清了,總之最後我選擇了不裝!畢竟我很少使用C語言。

坑四:YCM server not start. 好不容易跟著YCM官網的步驟進行了安裝,卻被告知:YCM server not start, use YCMServerRestart to restart. 還要在/tmp下找到出錯文件,裏面記錄了具體錯誤信息。

坑五:glibc-2.14. 查看YCM的錯誤記錄後發現:glibc-2.14 required by YCM Server. 好吧,再看看glibc的版本。
[root@localhost root]# strings /lib64/libc.so.6 |grep GLIBC
GLIBC_2.2.5
GLIBC_2.2.6
GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_PRIVATE
glibc是gnu發布的libc庫,glibc是linux系統底層的api, 幾乎其他任何運行庫都需要依賴它。不同的軟件可能對於glibc的版本要求不一樣。此處,我的linux中glibc最高為2.12版本,而YCM說它需要2.14版本。
升級glibc-2.14的過程也是相當曲折。配置參數時報錯:gcc or cmake 版本不符合要求,請參看INSTALL文件中的內容。查看之後發現我的gcc版本和cmake版本都比需要的要高出很多啊(具體是多少不記得了),怎麽還總是提示?找了很多文章也沒有解決,最後還是在stackoverflow上的一篇文章給了我啟發,既然我的版本比你高你識別不出來,幹脆就把配置腳本改一下,不再報錯不就行了。於是我修改了configure文件,把對gcc和cmake的版本錯誤的屏蔽掉,結果可以正常configure了。我估計啊,glibc-2.14是比較早的版本,所以configure代碼裏沒有考慮到更高版本的gcc和cmake的處理。
參見:http://cnodejs.org/topic/56dc21f1502596633dc2c3dc

坑六:make死循環. make一直在檢查環境,怎麽也停不下來,網上查看才知道是系統的時區不對,我用的英國東部時間,比配置glibc的時間稍晚了一些。解決辦法就是改為亞洲上海時區。參看我的一篇博文:http://blog.51cto.com/ponyjia/2094129

坑七:glibc-2.15. 總算安裝了glibc-2.14庫,string命令也能顯示,其他系統命令也都能用,只是有些小問題,比如說我以前能顯示中文的終端現在顯示亂碼,先不管它了,打開vim看看吧,咦?還是YCM server not start? 再去看/tmp下的日誌文件,我頓時無語。。。人家說“glibc-2.15 is required by YCM”。 能罵人嗎, 你怎麽不早說?難道還要安裝glibc-2.15?

坑八:glibc-2.20. 看在you complete me的份上,乖乖就範吧。不過等等,萬一我給了你2.15,你又想要2.16怎麽辦?給了你2.16,你又想要2.17呢?這麽個要法,不得把老夫累死?不如一次給個夠?於是我下載並安裝了glibc-2.20, 與glibc-2.14的方法一樣。
可是安裝並替換了libc.so.6之後,幾乎所有命令都不能用了, ls, mv, cp, vim等最簡單的命令都不行,網上找了下,才知道centos對glibc的依賴是方方面面的,不同版本的差異可能輕則造成功能紊亂,重則癱瘓變植物人。腫麽辦?
好在還在系統裏面,原來的glibc版本都還在,把libc.so.6的軟鏈接重新指向glibc-2.12, 又恢復正常了。使用如下命令:
rm -rf /lib64.so.6
LD_PRELOAD=/lib64/libc-2.12.so ln -s /lib64/libc-2.12.so /lib64/libc.so.6

坑九:glibc-2.15. 到這時,我已被折磨得精疲力盡了,已經有放棄的聲音出現在耳邊,但是最後一口氣還是不甘心,要不裝一下2.15試試?說不定行呢?結果是裝了2.15後,只要創建libc.so.6的軟鏈接,系統就會重啟,更別說YCM Server了。呃,好吧,我承認我就是賤。

坑十:rpm. 沒有最賤,只有更賤。我曾經掙紮過要不要放棄,因為就這破玩意已經花了我一整天的時間,沒有進展。理智告訴我技術就是這樣,每一個細節都可能出問題,不必太受傷。也不必太糾結是不是最終能成功,因為這世界不能成功的事情太多了。但是休息了一晚上之後,手癢的我又忍不住打開了搜索框。居然可以用rpm安裝glibc?rpm應該比較靠譜吧?畢竟把所需要的配置都集成進去了。可是。。可是。。。當我從不知什麽網站上(國外的,忘了)下載並安裝了glibc-2.15版rpm之後,粗大四了!我的系統命令徹底不能用了,並且可惡的rpm居然刪除了我系統中的glibc-2.12.so庫文件, 這下我想做so.6軟鏈接都不能了。而且使用glibc-2.14.so去恢復也不行,重啟系統也進不去了!又研究了半天,沒有頭緒,因為我不知道這個該死的rpm都做了什麽操作,也就無從下手去修復。

安裝個插件不成,還把我的系統也搞崩了。什麽YouCompleteMe, 我看是 You Destory Me 吧。不過也好,驗證了這條路走不通,這下可以徹底死心了。其實用Pycharm也挺好的,也有vim插件,雖然不如真正的vim功能多。工具就是工具,哪個好用就用哪個,在這上面浪費這麽多時間,不值。

終於該歇歇了!

最後,還有最後,我裝上了YouCompleteMe, 不過不是在CentOS6.8上---我早就想換掉這個系統了,而是在Fedora27上。安裝還算比較順利,原來那麽多麻煩其實主要是系統環境的問題。總是有解決辦法的,不是嗎?具體安裝過程見我另一篇博文:
http://blog.51cto.com/ponyjia/2094105

YouCompleteMe入坑指南