zoukankan      html  css  js  c++  java
  • Ubuntu16.04VIM无法补全错误记录

    先记录一下YouCompleteMe的安装过程。

    按照教程进行安装

    1. 安装 vundle 

    # vundle是vim的包管理器,十分好用
    cv@cv: ~$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    cv@cv: ~$ vim ~/.vimrc

    写入:

    " description: configuration of vim
    " author: phillee
    " date:    2019-06-04
    " email: phillee2016@163.com
    
    set nocompatible            " be iMproved, required
    filetype off                " required
    
    " set the runtime path to include Vundle and initialize
    set runtimepath+=/home/cv/.vim/bundle/Vundle.vim
    set runtimepath+=/home/cv/.vim/bundle/ctrlp.vim
    set runtimepath+=/home/cv/.vim/bundle/ultisnips
    
    call vundle#begin()
    " alternatively, pass a path where Vundle should install plugins
    " call vundle#begin('~/some/path/here')
    
    " let Vundle manage Vundle, required
    Plugin 'VundleVim/Vundle.vim'
    " The following are examples of different formats supported.
    " Keep Plugin commands between vundle#begin/end.
    
    " plugin on GitHub repo
    Plugin 'tpope/vim-fugitive'
    Plugin 'Valloric/YouCompleteMe'
    Plugin 'vim-syntastic/syntastic'
    Plugin 'nvie/vim-flake8'
    
    " " Track the engine
    Plugin 'SirVer/ultisnips'
    
    " Snippets are separated from the engine.
    Plugin 'honza/vim-snippets'
    
    " plugin from http://vim-scripts.org/vim/scripts.html
    " Plugin 'L9'
    " Git plugin not hosted on GitHub
    " Plugin 'git://git.wincent.com/command-t.git'
    
    " git repos on your local machine(i.e. when working on your own plugin)
    " Plugin 'file://home/gmarik/path/to/plugin'
    
    " The sparkup vim script is in a subdirectory of this repo called vim.
    " Pass the path to set the runtimepath properly.
    " Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
    
    " Install L9 and avoid a Naming conflict if you've already install a different version somewhere else.
    " Plugin 'ascenator/L9', {'name': 'newL9'}
                            
    " Define bundles via GitHub repo
    Bundle 'scrooloose/nerdtree'
    
    " All of your Plugins must be added before the following line
    call vundle#end()
    
    filetype plugin indent on
    
    " To ignore plugin indent changes, instead use:
    " filetype plugin on
    
    " Brief help
    " :PluginList                - lists configured plugins
    " :PluginInstall            - installs plugins; append '!' to update or just :PluginUpdate
    " :PluginSearch foo            - searches for foo; append '!' to refresh local cache
    " :PluginClean                - confirms removal of unused plugins; append '!' to auto-approve removal
    
    " see :h vundle for more details or wiki for FAQ
    " Put your non-Plugin stuff after this line
    
    set number
    set numberwidth=5
    
    set tabstop=4
    set background=dark
    set showcmd
    set encoding=utf-8
    
    " Default conf file path
    let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'
    " No query for loading ycm_extra_conf.py configuration when vim is opened
    let g:ycm_confirm_extra_conf=0
    
    let g:ycm_use_clangd=0
    
    set completeopt=longest,menu
                                
    " path of python Interpreter
    let g:ycm_path_to_python_interpreter='/usr/bin/python'
    " Enable complete syntax
    let g:ycm_seed_identifiers_with_syntax=1
    
    " Enable or not complete even in the comments
    let g:ycm_complete_in_comments=1
    let g:ycm_collect_identifiers_from_comments_and_strings=0
    let g:ycm_collect_identifiers_from_tags_files=1
    let g:ycm_min_num_of_chars_for_completion=2
    let g:ycm_autoclose_preview_window_after_completion=1
    let g:ycm_cache_omnifunc=0
    let g:ycm_complete_in_strings=1
    
    let python_highlight_all=1
    syntax on
    au BufNewFile,BufRead *.py
         set tabstop=4    |
         set softtabstop=4    |
         set shiftwidth=4    |
         set textwidth=79    |
         set expandtab    |
         set autoindent    |
         set fileformat=unix
    
    "Autoclose preview window when leave the insert mode
    autocmd InsertLeave * if pumvisible()==0|pclose|endif
    
    "The user-defined action of the direction keys"
    inoremap <expr> <Down>    pumvisible()?'<C-n>':'<Down>'
    inoremap <expr> <Up>    pumvisible()?'<C-p>':'<Up>'
    inoremap <expr> <PageDown>    pumvisible()?'<PageDown><C-p><C-n>':'<PageDown>'
    inoremap <expr> <PageUp>    pumvisible()?'<PageUp><C-p><C-n>':'<PageUp>'
    
    " NERDTree config
    map <F2> :NERDTreeToggle<CR>
    autocmd vimenter * NERDTree
    autocmd StdinReadPre * let s:std_in=1
    autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
    
    " This command is to open NERDTree automatically when vim starts up on opening
    " a directory.
    autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif 
    
    " This command is to close vim if the only window left open is a NERDTree.
    autocmd bufenter * if(winnr("$")==1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
    let g:NERDTreeDirArrowExpandable = '~'
    let g:NERDTreeDirArrowCollapsible = '~'
    
    " UltiSnips - Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe.
    let g:UltiSnipsExpandTrigger="<c-j>"
    let g:UltiSnipsListSnippets="<c-h>"
    let g:UltiSnipsJumpForwardTrigger="<c-j>"
    let g:UltiSnipsJumpBackwardTrigger="<c-k>"
    let g:UltiSnipsSnippetDirectories=['/home/cv/.vim/bundle/ultisnips/mysnippets/']
    
    " If you want :UltiSnipsEdit to split your window.
    let g:UltiSnipsEditSplit="vertical"
    .vimrc

    2. 安装 YouCompleteMe 

    cv@cv: ~$ sudo apt-get install build-essential cmake
    cv@cv: ~$ sudo apt-get install python-dev python3-dev
    cv@cv: ~$ cd ~/.vim/bundle/YouCompleteMe
    cv@cv: ~/.vim/bundle/YouCompleteMe$ git submodule update --init --recursive
    cv@cv: ~/.vim/bundle/YouCompleteMe$ ./install.py --clang-completer

    3. 安装 libclang ,否则无法语义补全

    cv@cv: ~/.vim/bundle/YouCompleteMe$ sudo apt-get install llvm-3.9 clang-3.9 libclang-3.9-dev libboost-all-dev

    4. 编译构建 ycm_core 库

    cv@cv: ~/.vim/bundle/YouCompleteMe$ mkdir .ycm_build
    cv@cv: ~/.vim/bundle/YouCompleteMe$ cd .ycm_build
    cv@cv: ~/.vim/bundle/YouCompleteMe/.ycm_build$ cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON -DUSE_SYSTEM_LIBCLANG=ON . ../third_party/ycmd/cpp
    cv@cv: ~/.vim/bundle/YouCompleteMe/.ycm_build$ cmake --build . --target ycm_core --config Release

    5. 配置文件

    主要是 ~/.vimrc 和 ~/.vim/.ycm_extra_conf.py 两个文件

    cv@cv: ~/.vim/bundle/YouCompleteMe/.ycm_build$ cp ~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim/
    
    cv@cv: ~/.vim/bundle/YouCompleteMe/.ycm_build$ sudo vim ~/.vim/.ycm_extra_conf.py

    添加 C++  头文件和 opencv 头文件索引,写入

    '-isystem',
    '/usr/include/c++/5.4.0',
    '-isystem',
    '/usr/local/include/opencv2',

    6. 然后安装各种插件

    有些插件需要先去 GitHub 上克隆到本地。

    打开 vim ,在命令模式下键入下面的插件安装指令,等待完成。

    cv@cv: ~$ vim
    :PluginInstall

    7. 试验一下效果

    再次打开 vim ,结果最下面有提示

    the ycmd server SHUT DOWN (restart with ':YcmRestartServer'). Unexpected error while ...M core library. Type ':YcmToggleLogs ycmd_41013_stderr_cys4wh16.log' to check the logs.

    根据提示键入 :YcmToggleLogs ycmd_41013_stderr_cys4wh16.log 

    # /tmp/ycmd_41013_stderr_cys4wh16.log
    Traceback (most recent call last):
      File "/home/cv/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/utils.py", line 637, in ImportAndCheckCore
        ycm_core = ImportCore()
      File "/home/cv/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/utils.py", line 628, in ImportCore
        import ycm_core as ycm_core
    ImportError: /home/cv/.vim/bundle/YouCompleteMe/third_party/ycmd/ycm_core.so: undefined symbol: clang_getCompletionFixIt

    原来是 clang_getCompletionFixIt 未定义,怎么办呢?

    Valloric/YouCompleteMe主页查看了一下,找到了一些线索

    根据指示运行 install.sh (因为 install.py 和 install.sh 运行效果一样,当然也可以使用 cv@cv: ~$ python install.py )

    cv@cv: ~$ ~/.vim/bundle/YouCompleteMe/install.sh
    #!/bin/sh
    
    echo "WARNING: this script is deprecated. Use the install.py script instead." 1>&2
    
    
    SCRIPT_DIR=$(dirname $0 || exit $?)
    
    command_exists() {
      command -v "$1" >/dev/null 2>&1 ;
    }
    
    PYTHON_BINARY=python
    if command_exists python2; then
      PYTHON_BINARY=python2
    fi
    
    $PYTHON_BINARY "$SCRIPT_DIR/install.py" "$@" || exit $?
    install.sh

    然后就ok了,现在补全功能可以用了。

    • 如果在执行 ./install.py --clang-completer  的过程中出现HASH mismatch错误
    Searching Python 2.7 libraries...
    Found Python library: /usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so
    Found Python headers folder: /usr/include/python2.7
    -- The C compiler identification is GNU 5.4.0
    -- The CXX compiler identification is GNU 5.4.0
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Found PythonLibs: /usr/lib/python2.7/config-x86_64-linux-gnu/libpython2.7.so (found suitable version "
    2.7.12", minimum required is "2.7") 
    -- Downloading libclang 8.0.0 from https://dl.bintray.com/micbou/libclang/libclang-8.0.0-x86_64-unknown-l
    inux-gnu.tar.bz2
    CMake Error at ycm/CMakeLists.txt:107 (file):
      file DOWNLOAD HASH mismatch
    
        for file: [/home/cv/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/../clang_archives/libclang-8.0.0-x
    86_64-unknown-linux-gnu.tar.bz2]
          expected hash: [e81a186cd1180ae80c17d67d8d0c101248f8ee032d138cf6f1e95001e733249c]
            actual hash: [e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855]
                 status: [35;"SSL connect error"]
    
    CMake Error at ycm/CMakeLists.txt:123 (message):
      Cannot find path to libclang in prebuilt binaries
    
    -- Configuring incomplete, errors occurred!
    See also "/tmp/ycm_build_JVaiLo/CMakeFiles/CMakeOutput.log".
    ERROR: the build failed.
    
    NOTE: it is *highly* unlikely that this is a bug but rather that this is a problem
    with the configuration of your system or a missing dependency. Please carefully
    read CONTRIBUTING.md and if you're sure that it is a bug, please raise an issue on
    the issue tracker, including the entire output of this script and the invocation
    line used to run it.

    问题详情可以参考 GitHub上YouCompleteMe  Issues: CMake Error at ycm/CMakeLists.txt: 92(file) file DOWNLOAD HASH mismatch #2353

    解决方案:可能是网络的问题,需要手动下载,放到指定位置,重新执行上面的指令即可。下载地址【 https://dl.bintray.com/micbou/libclang/ 】到网站上找到自己需要的版本下载即可。

    下载完成后需要放在 ~/.vim/bundle/YouCompleteMe/third_party/ycmd/clang_archives 文件夹下面

    mv ~/Downloads/libclang-8.0.0-x86_64-unknown-linux-gnu.tar.bz2 ~/.vim/bundle/YouCompleteMe/third_party/ycmd/clang_archives/
  • 相关阅读:
    Android网页打开指定App
    使用Android Studio Gradle实现友盟多渠道打包
    Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能
    Android使用Mob ShareSDK 分享不同平台
    Android布局优化之层级优化
    (Facebook开源项目)Fresco:一个新的Android图像处理类库
    关于Android开发的几点建议
    [AndroidTips]startService与bindService的区别
    基于HBase的手机数据备份系统 .
    MySQL在CenterOS和Ubuntu的安装
  • 原文地址:https://www.cnblogs.com/phillee/p/11050079.html
Copyright © 2011-2022 走看看