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的
  2. 如果发现某个函数不能补全或者报错的解决方法

    先看看函数所属的头文件,然后在百度或者直接去/usr/include,等位置去找找, 然后添加到.ycm_extra_conf.py中, 例如sys/socket.h没有自动补全,百度发现在/usr/include/x86_64-linux-gnu/中, 然后在添加'-isystem','/usr/include/x86_64-linux-gnu/'即可

  3. 强烈建议不要复制头文件到/usr/include

    这样图一时方便,但全都混乱了,就用上一步的方法最好,也便于自己理解各头文件的位置

  4. ycm server shutdown的解决方法

    需要进入~/.vim/bundle/youcompleteme目录下,install,具体如下:

    # 如果不执行这一步,下一步就报错
    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
  5. 不能补全另一个文件中自定义的类

    YCM 只在如下两种场景下触发语义补全:一是补全标识符所在文件必须在 buffer 中(即,文件已打开);一是在对象后键入 .、指针后键入 ->、名字空间后键入 ::。

    所以必须打开那个文件才行.

  6. 如果没有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
  7. 编译警告可以参见:https://blog.csdn.net/qq_17308321/article/details/79979514

Linux c++ vim环境搭建系列(3)——Ubuntu18.04.4编译安装youcompleteme的更多相关文章

  1. Linux c++ vim环境搭建系列(1)——Ubuntu18.04.4编译安装vim8.2

    1. vim源码编译安装 参考网址: https://github.com/ycm-core/YouCompleteMe/wiki/Building-Vim-from-source 安装各类依赖库 s ...

  2. Linux c++ vim环境搭建系列(0)——简介

    vim 学习 简介: 源码编译使用vim及其插件. 内容包含: vim的编译安装, llvm clang的编译安装, 插件youcompleteme的编译安装使用, 以及vim其他插件的使用. 搭建环 ...

  3. Linux c++ vim环境搭建系列(2)——Ubuntu18.04.4编译安装llvm clang

    2. 源码编译安装llvm clang 参考网址: https://llvhttps

  4. Linux c++ vim环境搭建系列(5)——vim使用

    5. 使用 5.1 快捷键及设置 5.1.1 光标移动 w : 正向移动到相邻单词的首字符 b : 逆向移动到相邻单词的首字符 e : 正向移动到相邻单词的尾字符 ge : 逆向移动到相邻单词的尾字符 ...

  5. Linux c++ vim环境搭建系列(4)——vim插件安装配置使用

    4. 插件 主要是c++相关的. ~/.vimrc文件在GitHub上有:https://github.com/whuwzp/vim_config 以下内容参考: https://github.com ...

  6. Linux c++ vim环境搭建系列(6)——CMakeLists.txt多文档多目录组织方法和编写示例

    CMakeLists.txt学习 1. 概要 主要是关于cmakelists.txt的编写模板,和多文档多目录的组织方法详解, 涉及第三方库的添加使用方法. 这里主要介绍cmakelists.txt的 ...

  7. 环境搭建系列-系统安装之centos 6.5安装与配置

    按照国际惯例,系列目录先奉上: 系列一:系统安装之centos 6.5安装与配置 系列二:准备工作之Java环境安装 系列三:数据为先之MySQL读写集群搭建 系列四:谈分布式之RabbitMQ集群搭 ...

  8. Ubuntu18.04下编译安装Guitarix 0.37.3

    准备工作 源文件下载 https://sourceforge.net/projects/guitarix/files/guitarix/ 安装依赖. 参考 https://sourceforge.ne ...

  9. Ubuntu环境搭建系列—JavaEE篇

    恩,其实我是一时兴起,所以就写了目前这几篇环境的博文,希望能给自己做一个笔记,同时也能够给一些新手带来一些帮助,不会在配置方面那么迷茫.本篇文章主要就是针对Java web开发进行环境搭建. 一.To ...

随机推荐

  1. BNP Paribas Cardif Claims Management

    2月20日: 查看任务介绍,二分类问题,评价标准logloss 下载数据 2月21~27日: 查看数据组成,标识分类变量.离散变量.连续变量. 发现连续数据有大量非随机空缺(占总量一半),主要集中在v ...

  2. 《Python学习手册 第五版》 -第15章 文档

    本章主要介绍Python中的文档,会通过多种方式来说明,如果查看Python自带文档和其他参考的资料 本章重点内容 1.#注释:源文件文档 2.dir函数:以列表显示对象中可用的属性 3.文档字符串 ...

  3. 搭建XSS测试平台

    XSS测试平台是测试XSS漏洞获取cookie并接收web页面的平台,XSS可以做js能做的所有事情,包括但不限于窃取cookie,后台增删文章.钓鱼.利用xss漏洞进行传播.修改网页代码.网站重定向 ...

  4. golang socket编程 net.Conn IO.EOF解读

    结论 首先,先定义下我的理解,当在Read时,收到一个IO.EOF,代表的就是对端已经关闭了发送的通道,通常来说是发起了FIN. 那么根据自己的实际业务,就可以进行判断,这里的IO.EOF到底该怎么利 ...

  5. SpringMVC框架——常用注解

    @RequestMapping Spring MVC 通过 @RequestMapping 注解将请求与业务方法进行映射,在方法定义处,在类定义都可以添加该注解. 常用参数: 1.value:指定请求 ...

  6. P4147 玉蟾宫 题解

    原题链接 简要题意: 求最大 \(0\) 矩阵.(将字符转化为数字) 本题是模板题,可以用来爆踩.??? 悬线法 来了! 其中绿色是 \(0\),红色是 \(1\). 下面以这个图为例讲一下算法流程. ...

  7. Selenium系列(十) - 针对Select下拉框的操作和源码解读

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  8. eNSP上NAT的配置

    NAT介绍: 早在20世纪90年代初,有关RFC文档就提出了IP地址耗尽的可能性.IPv6技术的提出虽然可以从根本上解决地址短缺的问题,但是也无法立刻替换现有成熟且广泛应用的IPv4网络.既然不能 立 ...

  9. 安装arcgis server时提示“应用程序无法启动,因为应用程序......或使用命令行sxstrace.exe”

    说一下这个原因:有几个条件不满足会产生这样的问题: 1.软件的发布是不需要安装的,直接在vs里编译好release版就发布了,而发布的时候如果缺少一些库文件,就会产生这样的问题.      一版都是目 ...

  10. JVM中内存分配策略及堆和栈的比较

    最近愈发对JVM底层的运行 原理产生了兴趣,遂查阅相关资料以备忘. 内存分配策略 根据编译原理的观点,程序运行时的内存分配,有三种策略,分别为静态的.堆式的.栈式的. 静态存储分配指的是在编译时就能确 ...