美文网首页
VIM - YCM安装(ubuntu:C/C++)

VIM - YCM安装(ubuntu:C/C++)

作者: Zokoo | 来源:发表于2020-04-23 00:22 被阅读0次

    下载篇

    为了节约你的时间,请务必注意两点:

    1. github的速度提起来 (百度“github加速” 可以找到方法)
    2. clang如果按YCM官方要求,需要找网速快一点的进行下载(我暂时没有找到好的方法),实在下载不了,就用系统自带的。

    参考: YCM Full installation guide 用Vundle进行安装。等大半天后,等来的结果还是失败。最终百度到方法:https://www.jianshu.com/p/d908ce81017a?nomobile=yes 章节1.5。进入~/.vim/vundle/目录,使用命令:

    $ git clone --recursive https://github.com/Valloric/YouCompleteMe.git
    

    这种方式比直接用vundle要直观多了,可以看到下载模块进度和错误打印。尝试几次clone后终于下载成功。
    这时,打开vim终于不会有报错了。

    编译篇

    由于PC上有几个clang版本,为了更好的控制,决定自己手工去配置CMakefile进行编译。参考了文章:https://www.cnblogs.com/rickyk/p/3877238.html

    1. 按步骤建立一个ycm_build文件夹, 进入该文件夹,运行命令:
    $ cmake -G "Unix Makefiles" . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
    

    出现如下信息:

    -- The C compiler identification is GNU 7.5.0
    -- The CXX compiler identification is GNU 7.5.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/x86_64-linux-gnu/libpython3.6m.so (found suitable version "3.6.9", minimum required is "3.5")
    -- NOT using libclang, no semantic completion for C/C++/ObjC will be available
    -- NOT using clang-tidy for static analysis.
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/chw/ycm_build
    

    可以看到是没有clang,C/C++不能自动补全。

    1. 修改CMakefile.txt文件,加上clang支持
    $ vi ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/CMakeLists.txt
    

    修改如下几个配置:

        option( USE_DEV_FLAGS "Use compilation flags meant for YCM developers" OFF )
        #设置 USE_CLANG_COMPLETER 为 ON
        option( USE_CLANG_COMPLETER "Use Clang semantic completer for C/C++/ObjC" ON)
        option( USE_SYSTEM_LIBCLANG "Set to ON to use the system libclang library" OFF )
        #以下2行设置自己的CLANG的PATH
        set( PATH_TO_LLVM_ROOT "/opt/clangllvm-10.0.0" CACHE PATH "Path to the root of a LLVM+Clang binary distribution" )
        set( EXTERNAL_LIBCLANG_PATH "/opt/clangllvm-10.0.0/lib/libclang.so" CACHE PATH "Path to the libclang library to use" )
    

    主要是将USE_CLANG_COMPLETER 打开,后面LLVM和LIBCLANG的路径需要设置为自己llvm的路径。将ycm_build文件夹清空,重新执行cmake命令:

    -- The C compiler identification is GNU 7.5.0
    -- The CXX compiler identification is GNU 7.5.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/x86_64-linux-gnu/libpython3.6m.so (found suitable version "3.6.9", minimum required is "3.5")
    -- Using libclang to provide semantic completion for C/C++/ObjC
    -- Using external libclang: /opt/clangllvm-10.0.0/lib/libclang.so.10
    -- NOT using clang-tidy for static analysis.
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/zokoo/ycm_build
    

    这里可以看到clang已经成功添加了。但仍有clang-tidy没有用起来。Clang-tidy需要在cmake命令行定义,但加上我这边在编译到52%后会挂很久,然后失败。从这篇文章说这个没啥用,所以不折腾,有兴趣可以去了解了解。https://stackoverflow.com/questions/55168132/youcompleteme-and-clang-tidy

    1. 编译,运行如下命令:
    $ cmake --build . --target ycm_core --config Release
    

    出现如下报错:

    Scanning dependencies of target BoostParts
    [  1%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/filesystem/src/codecvt_error_category.cpp.o
    [  3%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/filesystem/src/operations.cpp.o
    [  5%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/filesystem/src/path.cpp.o
    [  7%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/filesystem/src/path_traits.cpp.o
    [  9%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/filesystem/src/portability.cpp.o
    [ 11%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/filesystem/src/unique_path.cpp.o
    [ 13%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/filesystem/src/utf8_codecvt_facet.cpp.o
    [ 15%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/filesystem/src/windows_file_codecvt.cpp.o
    [ 17%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/c_regex_traits.cpp.o
    [ 19%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/cpp_regex_traits.cpp.o
    [ 21%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/cregex.cpp.o
    [ 23%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/fileiter.cpp.o
    [ 25%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/icu.cpp.o
    [ 27%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/instances.cpp.o
    [ 29%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/posix_api.cpp.o
    [ 31%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/regex.cpp.o
    [ 33%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/regex_debug.cpp.o
    [ 35%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/regex_raw_buffer.cpp.o
    [ 37%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/regex_traits_defaults.cpp.o
    [ 39%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/static_mutex.cpp.o
    [ 41%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/usinstances.cpp.o
    [ 43%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/w32_regex_traits.cpp.o
    [ 45%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/wc_regex_traits.cpp.o
    [ 47%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/wide_posix_api.cpp.o
    [ 49%] Building CXX object BoostParts/CMakeFiles/BoostParts.dir/libs/regex/src/winstances.cpp.o
    [ 50%] Linking CXX static library libBoostParts.a
    [ 50%] Built target BoostParts
    Scanning dependencies of target ycm_core
    [ 52%] Building CXX object ycm/CMakeFiles/ycm_core.dir/Candidate.cpp.o
    [ 54%] Building CXX object ycm/CMakeFiles/ycm_core.dir/CandidateRepository.cpp.o
    In file included from /home/zokoo/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/ClangCompleter/Location.h:21:0,
                     from /home/zokoo/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/ClangCompleter/FixIt.h:21,
                     from /home/zokoo/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/ClangCompleter/CompletionData.h:21,                 from /home/zokoo/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/CandidateRepository.cpp:25:
    /home/zokoo/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/ClangCompleter/ClangUtils.h:21:10: fatal error: clang-c/Index.h: No such file or directory
     #include <clang-c/Index.h>
              ^~~~~~~~~~~~~~~~~
    compilation terminated.
    ycm/CMakeFiles/ycm_core.dir/build.make:86: recipe for target 'ycm/CMakeFiles/ycm_core.dir/CandidateRepository.cpp.o' failed
    make[3]: *** [ycm/CMakeFiles/ycm_core.dir/CandidateRepository.cpp.o] Error 1
    CMakeFiles/Makefile2:140: recipe for target 'ycm/CMakeFiles/ycm_core.dir/all' failed
    make[2]: *** [ycm/CMakeFiles/ycm_core.dir/all] Error 2
    CMakeFiles/Makefile2:152: recipe for target 'ycm/CMakeFiles/ycm_core.dir/rule' failed
    make[1]: *** [ycm/CMakeFiles/ycm_core.dir/rule] Error 2
    Makefile:131: recipe for target 'ycm_core' failed
    make: *** [ycm_core] Error 2
    

    找不到头文件。这是Include路径没把llvm包含进来。我采用的方法是定义新环境变量:

    $ vi ~/.bashrc
    

    在文件末尾加上三行:

    export PATH=/opt/clangllvm-10.0.0/bin:$PATH
    export C_INCLUDE_PATH=/opt/clangllvm-10.0.0/include:$C_INCLUDE_PATH
    export CPLUS_INCLUDE_PATH=/opt/clangllvm-10.0.0/include:$CPLUS_INCLUDE_PATH
    

    保存退出,更新环境变量:

    $ source ~/.bashrc
    

    重新编译后OK。

    使用篇

    进入我的测试目录,打开test.c文件,会有类似如下报错:

    NoExtraConfDetected: No .ycm_extra_conf.py file detected, so no compile flags are available. Thus no semantic suppor...
    

    是因为缺少配置文件,可在当前文件夹下新建一个.ycm_extra_conf.py文件,写入如下内容:

    def Settings( **kwargs ):
       return {
        'flags': [ '-x', 'c++', '-Wall', '-Wextra', '-Werror' ],
       }
    

    最终效果如下:


    image.png

    相关文章

      网友评论

          本文标题:VIM - YCM安装(ubuntu:C/C++)

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