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


    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

  • 相关阅读:
    关于栈部分知识点
    面向对象--四则运算
    转型第一步
    输入输出文件版本——计算题
    作业二
    2017《面向对象程序设计》课程作业一
    第四次作业
    light oj 1079
    Light oj 1080
    Codeforces 486B OR in Matrix【水题】
  • 原文地址:https://www.cnblogs.com/whuwzp/p/ubuntu_vim_3.html
Copyright © 2020-2023  润新知