美文网首页MAC + LINUX + VIM + GIT + Latex + Markdown
Ubuntu18.04 编译安装使用youcompleteme

Ubuntu18.04 编译安装使用youcompleteme

作者: 笔默纸言 | 来源:发表于2020-03-01 18:29 被阅读0次

这个是关于vim学习的总结,项目地址:https://github.com/whuwzp/vim_config

3. youcompleteme编译安装

参考网址: https://github.com/ycm-core/YouCompleteMe#linux-64-bit
建议不要用这个博客的方法: https://github.com/yangyangwithgnu/use_vim_as_ide

  1. 安装插件管理器vundle
    git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    # 在 ~/.vimrc 增加相关配置信息
    
    " vundle 环境设置
    filetype off
    set rtp+=~/.vim/bundle/Vundle.vim
    " vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间
    call vundle#begin()
    Plugin 'VundleVim/Vundle.vim'
    Plugin 'ycm-core/YouCompleteMe'
    
    " 插件列表结束
    call vundle#end()
    filetype plugin indent on
    
  2. 打开vim, 输入:PluginInstall, 下载YouCompleteMe
  3. 安装
    # 依赖项
    sudo apt install build-essential cmake python3-dev
    cd ~/.vim/bundle/YouCompleteMe
    # 如果要选择其他语言支持可以选, 参考网址里有
    python install.py --clang-completer
    
  4. 编辑文件在工程项目目录中新建.ycm_extra_conf.py,我们只需要改flags中头文件的目录即可,内容如下(此内容参考https://github.com/yangyangwithgnu/use_vim_as_ide):
    import os 
    import ycm_core 
    flags = [ 
        '-std=c++11', 
        '-O0', 
        '-Werror', 
        '-Weverything', 
        '-Wno-documentation', 
        '-Wno-deprecated-declarations', 
        '-Wno-disabled-macro-expansion', 
        '-Wno-float-equal', 
        '-Wno-c++98-compat', 
        '-Wno-c++98-compat-pedantic', 
        '-Wno-global-constructors', 
        '-Wno-exit-time-destructors', 
        '-Wno-missing-prototypes', 
        '-Wno-padded', 
        '-Wno-old-style-cast',
        '-Wno-weak-vtables',
        '-x', 
        'c++', 
        '-I',
        '.',
        '-isystem', 
        '/usr/local/include/c++/v1/',
        '-isystem',
        '/usr/include/',
        '-isystem',
        '/usr/',
        '-isystem',
        '/usr/include/x86_64-linux-gnu/',
    ] 
    compilation_database_folder = '' 
    if compilation_database_folder: 
    database = ycm_core.CompilationDatabase( compilation_database_folder ) 
    else: 
    database = None 
    SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ] 
    def DirectoryOfThisScript(): 
    return os.path.dirname( os.path.abspath( __file__ ) ) 
    def MakeRelativePathsInFlagsAbsolute( flags, working_directory ): 
    if not working_directory: 
        return list( flags ) 
    new_flags = [] 
    make_next_absolute = False 
    path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ] 
    for flag in flags: 
        new_flag = flag 
        if make_next_absolute: 
        make_next_absolute = False 
        if not flag.startswith( '/' ): 
            new_flag = os.path.join( working_directory, flag ) 
        for path_flag in path_flags: 
        if flag == path_flag: 
            make_next_absolute = True 
            break 
        if flag.startswith( path_flag ): 
            path = flag[ len( path_flag ): ] 
            new_flag = path_flag + os.path.join( working_directory, path ) 
            break 
        if new_flag: 
        new_flags.append( new_flag ) 
    return new_flags 
    def IsHeaderFile( filename ): 
    extension = os.path.splitext( filename )[ 1 ] 
    return extension in [ '.h', '.hxx', '.hpp', '.hh' ] 
    def GetCompilationInfoForFile( filename ): 
    if IsHeaderFile( filename ): 
        basename = os.path.splitext( filename )[ 0 ] 
        for extension in SOURCE_EXTENSIONS: 
        replacement_file = basename + extension 
        if os.path.exists( replacement_file ): 
            compilation_info = database.GetCompilationInfoForFile( replacement_file ) 
            if compilation_info.compiler_flags_: 
            return compilation_info 
        return None 
    return database.GetCompilationInfoForFile( filename ) 
    def FlagsForFile( filename, **kwargs ): 
    if database: 
        compilation_info = GetCompilationInfoForFile( filename ) 
        if not compilation_info: 
        return None 
        final_flags = MakeRelativePathsInFlagsAbsolute( 
        compilation_info.compiler_flags_, 
        compilation_info.compiler_working_dir_ ) 
    else: 
        relative_to = DirectoryOfThisScript() 
        final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to ) 
    return { 
        'flags': final_flags, 
        'do_cache': True 
    }
    
    
    这个在 https://github.com/whuwzp/vim_config 中有保存

注意:

  1. .ycm_extra_conf.py中的头文件添加方法: 我安装clang是用默认的路径/usr/local,所以增加了'-isystem', '/usr/local/include/c++/v1/'
- `'-isystem','/usr/include/'`: 这个是系统头文件
- `'-isystem','/usr/'`: 这也是系统的
- `'-isystem','/usr/include/x86_64-linux-gnu/'`:这个是linux的
  1. 如果发现某个函数不能补全或者报错的解决方法
    先看看函数所属的头文件,然后在百度或者直接去/usr/include,等位置去找找, 然后添加到.ycm_extra_conf.py中, 例如sys/socket.h没有自动补全,百度发现在/usr/include/x86_64-linux-gnu/中, 然后在添加'-isystem','/usr/include/x86_64-linux-gnu/'即可
  2. 强烈建议不要复制头文件到/usr/include
    这样图一时方便,但全都混乱了,就用上一步的方法最好,也便于自己理解各头文件的位置
  3. ycm server shutdown的解决方法
    需要进入~/.vim/bundle/youcompleteme目录下,install,具体如下:
```sh
# 如果不执行这一步,下一步就报错
git submodule update --init --recursive
# 然后install
sudo ./install.sh --clang-completer
# 如果上一步报错缺少regex或者cregex,那就是git submodule update --init --recursive没有完全下载,那就去目录下找,例如我的是regex,到youcompleteme的github下找到了thrid/ycmd/third/regex,然后发现子项目的地址https://github.com/ycm-core/regex.git,然后自己git clone下来,手动拷贝到那个目录就好,例如git clone https://github.com/ycm-core/regex.git
```   
  1. 不能补全另一个文件中自定义的类
    YCM 只在如下两种场景下触发语义补全:一是补全标识符所在文件必须在 buffer 中(即,文件已打开);一是在对象后键入 .、指针后键入 ->、名字空间后键入 ::。
    所以必须打开那个文件才行.
  2. 如果没有boost
    那就自己下载安装boost
    以下参照: https://www.cnblogs.com/smallredness/p/9245127.html
```
解压到一个目录
tar -zxvf boost_1_66_0.tar.gz
1、正常编译:
进入boost_1_66_0目录中
cd boost_1_66_0
./bootstrap.sh --with-libraries=all --with-toolset=gcc
--with-liraries:需要编译的库
--with-toolset:编译时使用的编译器
安装boost库
./b2 install --prefix=/usr
```

相关文章

网友评论

    本文标题:Ubuntu18.04 编译安装使用youcompleteme

    本文链接:https://www.haomeiwen.com/subject/rgshkhtx.html