1. 程式人生 > >VIM補全外掛YouCompleteMe編譯安裝詳細步驟

VIM補全外掛YouCompleteMe編譯安裝詳細步驟

# VIM神級補全外掛YouCompleteMe安裝詳細步驟

YouCompleteMe(以下簡稱YCM)是Google搜尋組程式設計師Valloric開發的VIM程式碼自動補全外掛,與其它補全外掛相比,最大的特點是能夠基於語義完成補全,支援多種語言(智慧補全支援Python/C家族/JS/Rust等)。對於C/C++語言,該外掛能夠利用Clang前端編譯器的語義補全介面對當前程式碼產生符合上下文的智慧補全提示,且其補全結果排名應用了搜尋引擎的結果排序技術。
效果如下
ycm_snapshot
該外掛是屬於用VIM編碼的殺手級外掛,使用該外掛以後,自動完成功能秒殺sublime text,notepad++等文字編輯器,直逼Visual Studio.
雖然好用,但是該外掛出了名的難裝,因為需要自己編譯。
關於如何從Clang原始碼開始安裝該外掛,網上有數篇blog解釋了具體步驟,但是經過一一實驗,由於系統環境不同,全部失敗

了。為了安裝該外掛,本人找資料、編譯(共編譯了cmake 3.4.3/gcc 4.8.2/llvm 3.9/glibc 2.21/YCM等5個元件,歷時大半天)。 整個安裝配置過程前後花了至少一天半,現將安裝的曲折過程全程記錄如下。

系統環境

  $ rpm --query centos-release
      centos-release-6-4.el6.centos.10.x86_64
  $ gcc --version # 原版本4.4, 後來自己手動編譯了4.8以支援C++ 11
    gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
    Copyright (C) 2013
Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

第一次嘗試

第一次安裝不使用完全安裝,直接按照YCM官網的指南直接輸入

  python install.py --clang-completer
  python run_tests.py

結果編譯連結過程出現以下錯誤

  [ 98%] Building CXX object ycm/tests/CMakeFiles/ycm_core_tests.dir/main.cpp.o
[100%] Building CXX object ycm/tests/CMakeFiles/ycm_core_tests.dir/TestUtils.cpp.o
Linking CXX executable ycm_core_tests
../../clang+llvm-3.6.0-x86_64-linux-gnu/lib/libclang.so: undefined reference to `[email protected]_2.15'
../../clang+llvm-3.6.0-x86_64-linux-gnu/lib/libclang.so: undefined reference to `[email protected]_2.14'
collect2: error: ld returned 1 exit status
make[3]: *** [ycm/tests/ycm_core_tests] Error 1
make[2]: *** [ycm/tests/CMakeFiles/ycm_core_tests.dir/all] Error 2
make[1]: *** [ycm/tests/CMakeFiles/ycm_core_tests.dir/rule] Error 2
make: *** [ycm_core_tests] Error 2
Traceback (most recent call last):
  File "/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/build.py", line 196, in 
    Main()
  File "/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/build.py", line 189, in Main
    BuildYcmdLibs( GetCmakeArgs( args ) )
  File "/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/build.py", line 152, in BuildYcmdLibs
    _err = sys.stderr )
  File "/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/sh/sh.py", line 1021, in __call__
    return RunningCommand(cmd, call_args, stdin, stdout, stderr)
  File "/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/sh/sh.py", line 486, in __init__
    self.wait()
  File "/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/sh/sh.py", line 500, in wait
    self.handle_command_exit_code(exit_code)
  File "/home/user/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/sh/sh.py", line 516, in handle_command_exit_code
    raise exc(self.ran, self.process.stdout, self.process.stderr)
sh.ErrorReturnCode_2: 

  RAN: '/usr/bin/make -j 8 ycm_core_tests'

  STDOUT:


  STDERR:

輸入以下命令檢視依賴庫

  strings ~/.vim/bundle/YouCompleteMe/third_party/ycmd/libclang.so.3.8 | grep -i glibc

發現是liclang.so.3.8需要至少Glibc 2.15, GlibCXX 3.4.19, Centos 6.4自帶的Glibc版本2.12版本太低,無法滿足最低版本要求。
於是去LLVM官網上下載了一個針對Centos6編譯好的Clang3.8,然後按照完全安裝指南指定編譯選項

  cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=~/ycm_temp/llvm_root_dir . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp

結果問題依舊。需要系統更高版本Glibc的問題依然未解決。接著嘗試了下載針對Fedora 18預編譯的YCM所支援的最早Clang版本3.3,結果一樣,連結失敗。

由於YCM官網強烈不推薦自己編譯Clang,於是本人嘗試直接使用包管理器安裝老版本Clang

  sudo yum install -y clang

結果使用-DEXTERNAL_LIBCLANG_PATH選項編譯好YCM以後進入vim輸入’:YcmToggleLogs stderr’發現不能用,YCM需要Clang3.8版本,暈死。
目前為止除非直接下載新版Glibc並替換系統庫,否則無法繼續下去。該問題的關鍵原因是可執行檔案連結的庫路徑是直接硬編碼在檔案中的,具體原理可以參考這裡。但是, 替換系統核心庫Glibc是一件極其容易導致系統崩潰的行為,Google了一下發現已經有好幾個人這麼弄中招了。公司72伺服器上有MySQL伺服器儲存了數T的使用者行為資料,不能冒這個險。因此,唯一的選擇只能是從原始碼重新編譯Clang+llvm,並連結指定的Glibc庫。
總結: 由於10.200.8.72(以下簡稱72)上安裝的64位Centos 6.4系統版本太老不支援直接安裝YCM自帶的預編譯的的llvm+clang(要求GLibc >= 2.15且GLibCXX >= 3.4.19, 其中72上自帶的Glibc 2.12為系統核心元件無法替換,因此只能重新編譯clang3.8或以上的版本並連結下載的新版GLibc)

## 成功編譯過程

cmake 3.4.3 required by llvm compilation

    cd ~
    wget https://cmake.org/files/v3.4/cmake-3.4.3-Linux-x86_64.tar.gz
    tar -zxf cmake-3.4.3-Linux-x86_64.tar.gz

gcc 4.8.2

    cd ~
    mkdir -p ~/gcc4.8/src
    wget https://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.gz
    tar -zxf gcc-4.8.2.tar.gz -C ~/gcc4.8/src
    cd ~/gcc4.8/src/
    mkdir gcc-build-4.8.2
    cd gcc-build-4.8.2
    ../gcc-4.8.2/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
    make -j 6 # 2.3G+, 事後可刪除gcc-build目錄
    sudo cp -fp ./x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.18 /usr/lib64/ 
    mv /usr/lib64/libstdc++.so.6.0.18 /usr/lib64/libstdc++.so.6 # ln -sf ./lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so /usr/lib64/

編譯gcc大約需要半小時,為了節省時間,make時使用’-j 6’指定了6個核心

glibc 2.21

    mkdir -p ~/code/glibc
    wget http://ftp.gnu.org/gnu/glibc/glibc-2.21.tar.gz
    tar -zxf glibc-2.21.tar.gz -C ~/code/glibc
    cd ~/code/glibc/glibc-2.21
    mkdir build
    cd build
    export LD_FLAGS='-Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib64:/usr/lib64'
    ../configure --with-binutils=/usr/local/bin --prefix=/usr/local/glibc/glibc-2.21
    make -j 6
    sudo make install

安裝過程會出現如下警告

/home/rstudio2/code/glibc/glibc-2.21/build/elf/ldconfig: Warning: ignoring configuration file that cannot be opened: /usr/local/glibc/glibc-2.21/etc/ld.so.conf: No such file or directory
make[1]: Leaving directory `/home/user/code/glibc/glibc-2.21'

不用理會,直接忽略

llvm 3.9

    mkdir ~/code
    cd ~/code/llvm_source_tree
    git clone http://llvm.org/git/llvm.git
    cd ~/code/llvm_source_tree/llvm/tools
    git clone http://llvm.org/git/clang.git
    cd ~/code/llvm_source_tree/llvm/projects
    git clone http://llvm.org/git/compiler-rt.git
    git clone http://llvm.org/git/test-suite.git # 1.8G+
    cd ~/code/llvm_source_tree/llvm
    git config branch.master.rebase true
    mkdir -p ~/code/llvm_source_tree/build
    cd ~/code/llvm_source_tree/build
    export CXXFLAGS='-std=c++11 -Wl,--rpath=/usr/local/glibc/glibc-2.21/lib:/lib64:/usr/lib64 -Wl,--dynamic-linker=/usr/local/glibc/glibc-2.21/lib/ld-linux-x86-64.so.2'
    ~/cmake-3.4.3-Linux-x86_64/bin/cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE='Release' ~/code/llvm_source_tree/llvm/
    make -j 6 # 1.5G+, 事後可刪除build目錄
    sudo make install

編譯llvm大約需要半小時,為了節省時間,make時使用’-j 6’指定了6個核心

YCM

首先安裝vim包管理外掛vundle, 關於該外掛如何安裝,可以Google, 例如這裡
接著正式開始安裝YCM外掛

    Plugin 'Valloric/YouCompleteMe' # bundle required
    cd .vim/bundle/YouCompleteM
    cmake28 -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=/usr/local/lib/libclang.so.3.9 . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
    cmake28 --build . --target ycm_core
    python install.py  --clang-completer
    sudo pip install --upgrade pip
    sudo pip install flake8 nose future mock PyHamcrest
    python run_tests.py
                ----------------------------------------------------------------------
        Ran 221 tests in 6.323s

        OK (SKIP=3)

配置YCM

檢視系統編譯器include搜尋路徑

    echo | cpp -Wp,-v
    echo | /usr/local/bin/clang -std=c++11 -stdlib=libc++ -v -E -x c++ -

將這兩個命令的輸出新增至YCM配置檔案
‘/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py’

編輯配置檔案 .ycm_extra_conf.py

在flags編譯器選項加入以下行

    '-I',
    '/usr/include/c++/4.8.2',
    '-I',
    '/opt/rh/devtoolset-2/root/usr/include/c++/',
    '-I',
    '/opt/rh/devtoolset-2/root/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include',
    '-I',
    '/usr/local/include/',  

其中/opt/rh/devtoolset-2/root/usr 是寫本文之前下載的gcc4.8.2原始碼的檔案路徑,當時編譯的libstdc++.so.*已經找不到了,為了演示在開始步驟重新下載編譯了gcc 4.8.2,這次放在了~/gcc目錄下。

編輯vim配置檔案’~/.vimrc’

    ~/.vimrc
        let g:ycm_auto_trigger = 1 
        " for ycm
        let g:ycm_error_symbol = '>>'
        let g:ycm_warning_symbol = '>*'
        let g:ycm_autoclose_preview_window_after_completion = 1 
        let g:ycm_autoclose_preview_window_after_insertion = 1 
        let g:ycm_global_ycm_extra_conf = "~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py"
        nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>
        nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
        nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
        nnoremap <F4> :YcmDiags<CR>                                                                                                                                                                                                                            
        inoremap <c-o> <c-x><c-o>
        let g:ycm_semantic_triggers = { 
        \     'c' : ['->', '  ', '.', ' ', '(', '[', '&'],
        \     'cpp,objcpp' : ['->', '.', ' ', '(', '[', '&', '::'],
        \     'perl' : ['->', '::', ' '],
        \     'php' : ['->', '::', '.'],
        \     'cs,java,javascript,d,vim,python,perl6,scala,vb,elixir,go' : ['.'],
        \     'ruby' : ['.', '::'],
        \     'lua' : ['.', ':']
        \ }

至此,終於在伺服器上的古董系統CentOS 6.4上搞定了YCM的安裝,可以愉快的敲程式碼了。安裝後效果
ycm_cpp_使用效果

相關推薦

VIM外掛YouCompleteMe編譯安裝詳細步驟

# VIM神級補全外掛YouCompleteMe安裝詳細步驟 YouCompleteMe(以下簡稱YCM)是Google搜尋組程式設計師Valloric開發的VIM程式碼自動補全外掛,與其它補全外掛相比,最大的特點是能夠基於語義完成補全,支援多種語言(智慧補全

Vim智慧外掛YouCompleteMe安裝

以下的內容來源與官方的手冊,內容是英文版的,自己整理了一下。後面的關於YCM的介紹只翻譯了部分,更多的內容包括最終要的選項部分,只能下次機會再翻譯了。 在安裝和配置的整個過程中,這兩篇文章給了我很大的幫助: 一、準備 1:確保Vim的版本至少是Vim73.584,且支援

CentOS7 Vim自動外掛----YouCompleteMe安裝與配置

最近剛裝了新系統CentOS7,想要把編碼環境配置一下,使用Vim編寫程式少不了使用自動補全外掛,我以前用的是neocomplcache+code_complete+omnicppcomplete。但在網上搜索時,看到了YouCompleteMe,說YCM更好用一些。

Vim程式碼外掛——YouCompleteMe安裝說明

YCM快速安裝(Ubuntu16.04 x64系統) YouCompleteMe是Vim的一種快速的,模糊搜尋的編譯型程式碼補全外掛。 Vim至少需要7.3.598版本,且需要python2、python3支援,Ubuntu 14.04版以上的Vim都可以。 在終端下執行$

mysql 5.6.25編譯安裝詳細步驟

dir 支持斷點續傳 啟動項 ++ roo blog eve files 文件 1 #安裝依賴 2 yum -y install make gcc-c++ cmake bison-devel ncurses-devel perl vim 3 4

Mysql 5.7 Linux編譯安裝詳細步驟

二、下載mysql source_code 1 2 3 4 5 這裡說一下,進入myql下載頁面後選擇source_code: 然後選擇 Generic Linux (Architecture Independent), Compressed TAR Archive  Includes Boost Hea

Centos vim配置及外掛YouCompleteMe程式碼安裝vimplus

Linux下的編譯器vim vim是Linux下自帶而且非常強大的編譯器,但是它與一些整合的IDE相 常簡單並且可以隨手配置出自己喜歡的風格,對於初學者當然還是建議 用原味的,要做到熟悉vim的一些基本快捷鍵。最難受到就是一些,用了 有一段時間,自己想有一個可以的開發

vim安裝youcompleteme自動外掛

本文介紹的是如何在vim中安裝youcompleteme自動補全外掛 一、安裝youcompleteme 開啟檔案~/.vimrc 新增下面一行程式碼 Bundle 'Valloric/YouCompleteMe' 儲存退出,開啟一個vim新檔

VIM 代碼自動YouCompleteMe安裝及配置

one src http class isp iyu height html img 效果 下載 使用Vundle安裝 YCM 1. 安裝Vundle window用戶安裝vundle參考這裏:Windows下 vundle的安裝和使用 2. VIM 代

vim 自動提示、自動外掛 YouCompleteMe for windows Gvim 安裝及使用效果

YouCompleteMe is a fast, as-you-type, fuzzy-search(親~~支援模糊匹配哦) code completion engine for Vim. It has two completion engines: an identifier-based engi

Vim程式碼外掛YouCompleteMe

Vim的程式碼補全一般有兩種實現方案: 1. 第一種是採用ctags + OmniCppComplete ,參考:http://blog.chinaunix.net/uid-20737871-id-3402590.html 2. 第二種是採用YouCompl

vim環境配置之智慧工具YouCompleteMe(YCM)的安裝和配置

介紹:YoucomplemeMe是一個很強大的智慧補全工具,對C++的支援特別好 安裝YouComplemeMe: 這裡只介紹一種安裝方法,用vundle安裝 在成功安裝vundle之後,我們可以通過在~/.vimrc里加入下面程式碼: filetype off set

vim python自動外掛:pydiction

vim python自動補全外掛:pydiction 可以實現下面python程式碼的自動補全: 1.簡單python關鍵詞補全 2.python 函式補全帶括號 3.python 模組補全 4.python 模組內函式,變數補全 5.from module

自動外掛 jedi-vim

安裝方式 1.  在.vimrc 新增 jedi-vim 和 supertab call vundle#begin() ... Bundle 'davidhalter/jedi-vim' Bundle 'ervandew/supertab' ... call vun

zsh安裝自動外掛incr

使用zsh的自動補全功能,首先滿足下面的條件: 你用 oh-my-zsh 來協助你完成 zsh 的配置 你開啟了 zsh 你下載了這個 外掛 你把外掛執行shell 寫到了你的 .zshrc 配置檔案中 上面說到的 1,2 在之前的博文裡面早

vs-code中,react元件自動外掛的配置

react元件自動補全外掛:  輸入rcc,按tab鍵    ②    外掛截圖: ③   外掛的配置: 點選檔案-首選項-設定:點選後會是以下介面 然後點選那三個點---"開啟sett

阿里雲輕量級伺服器和NGINX部署Django專案 django安裝tinymce centos7安裝python3 以及tab功能 常用服務安裝部署

部署條件:         1.一臺阿里雲伺服器(本人的是CentOS系統的伺服器)         2.已經構建好的專案       &nbs

Vue 自動外掛

Vue實現的輸入框自動補全外掛: 先說實現的效果: 不想廢話,主要用到了以下的幾點: 1.子元件需要通過父元件輸入的關鍵字從後端做智慧匹配,這裡使用 props:父元件向子元件傳遞引數 $parent.$data:子元件對父元件的引數進行賦值 目的:父子

sublime text3 python程式碼自動提示/外掛sublimecodeintel配置

自動提示/補全python程式碼 選擇 Perference-Package Settings-SublimeCodeIntel-Settings-User,複製以下配置: {     "codeintel_language_settings": {         "Python3": {    

MySQL5.6.12原始碼編譯安裝詳細過程

本人轉自:http://blog.csdn.net/mchdba/article/details/35994251 1 下載安裝包download tar.gz wget http://download.csdn.net/detail/mchdba/7545037​ ps: