• [转] ubuntu安装Sublime Text 3并使用SublimeClang插件


    原文地址:https://blog.csdn.net/cywosp/article/details/32721011

    3. 安装强大的SublimeClang插件


        SublimeClang是Sublime Text中唯一的C/C++自动补全插件,功能强大,自带语法检查功能,不过最近作者已经停止更新了,目前只能在Sublime Text 2的Package Control中可以找到并自动安装,在SublimeText 3中只能手动通过源码安装,其代码线在https://github.com/quarnster/SublimeClang中。具体安装步骤如下:

    安装相关软件
        sudo apt-get install cmake build-essential clang git
        cd ~/.config/sublime-text-3/Packages
        git clone --recursive https://github.com/quarnster/SublimeClang SublimeClang
        cd SublimeClang
        cp /usr/lib/x86_64-linux-gnu/libclang-3.4.so.1 internals/libclang.so      #这一步很重要,如果你的clang库不是3.4版本的话,请将对应版本的库拷贝到internals中
        cd src
        mkdir build
        cd build
        cmake ..
        make

    一切成功的话将会在SublimeClang/internals目录中生成libcache.so库文件。重启Sublime Text,然后按快捷键Ctrl + `(Esc下面那个键)打开自带的控制输出,看看有没有错误,如果没有错误就说明一切OK了。接下来就是配置自己的文件了,按下ctrl + shift + p快捷键,在弹出的输入框中输入 sublimeclang settings ,然后选择带User那一行,在打开的文件中输入如下信息:

    {
        "show_output_panel": false,
        "dont_prepend_clang_includes": true,
        "inhibit_sublime_completions": false,

        "options":
        [
            "-std=gnu++11",
            "-isystem", "/usr/include",
            "-isystem", "/usr/include/c++/*",
            "-isystem", "/usr/include/c++/4.8",
            "-isystem", "/usr/include/c++/4.8/*",
            "-isystem", "/usr/include/boost",
            "-isystem", "/usr/include/boost/**",
            "-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include",
            "-isystem", "/usr/lib/gcc/x86_64-linux-gnu/4.8/include/*"
        ]
    }
    注释:我的gcc版本为4.8,如果你的不是请替换对应的版本,在#include相应的头文件后保存当前文件,在接下来的操作中将更快的提示所包含在头文件的函数或者变量。

      注意:在 SublimeClang.sublime-settings 中新增或更改路径后,需要重新打开文件才可以生效,否则已打开的文件可能因为缓存原因使用的还是原来的配置。

    ------------------------------------------------------2018-09-23更新------------------------------------------------------

      我在新装的 ubuntu18.04 系统上进行到最后的 make 编译步骤时出错,报错的信息如下:

    newdawn@newdawn-X450VC:~/.config/sublime-text-3/Packages/SublimeClang/src/build$ make
    Scanning dependencies of target cache
    [ 50%] Building CXX object CMakeFiles/cache.dir/main.cpp.o
    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:218:39: error: template argument 1 is invalid
     typedef std::vector<shared_ptr<Entry> > EntryList;
                                           ^
    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:218:39: error: template argument 2 is invalid
    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp: In function ‘void trim(EntryList&)’:
    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:601:25: error: qualified-id in declaration before ‘i’
         EntryList::iterator i = mEntries.begin();
                             ^
    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:603:12: error: ‘i’ was not declared in this scope
         while (i != mEntries.end() && (*i)->display[0] == '	')
                ^
    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:603:26: error: request for member ‘end’ in ‘mEntries’, which is of non-class type ‘EntryList {aka int}’
         while (i != mEntries.end() && (*i)->display[0] == '	')
                              ^~~
    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:605:18: error: request for member ‘erase’ in ‘mEntries’, which is of non-class type ‘EntryList {aka int}’
             mEntries.erase(i);
                      ^~~~~
    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:606:22: error: request for member ‘begin’ in ‘mEntries’, which is of non-class type ‘EntryList {aka int}’
             i = mEntries.begin();
                          ^~~~~
    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:609:18: error: request for member ‘begin’ in ‘mEntries’, which is of non-class type ‘EntryList {aka int}’
         if (mEntries.begin() == mEntries.end())
                      ^~~~~

      一开始感到很奇怪,在网上搜了好久没发现有类似的错误(毕竟这个插件本来就很少人用,更别提更少见的编译错误了),插件使用的是 cmake 的编译方式,我对 cmake 不太熟悉,但看报错信息大概知道是在编译阶段出错的(因此排除了缺少xx库的原因),可是上面没有显示使用的是哪个编译器,所以也不好手动模拟编译。于是我只好快速了解一下 cmake 的机制,然后通过 “Building CXX object CMakeFiles....” 这关键的一句在 cmake 生成的文件 build.make 里找到了一点线索(grep 即可):

    @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building CXX object CMakeFiles/cache.dir/main.cpp.o"
    /usr/bin/c++   $(CXX_DEFINES) $(CXX_FLAGS) -o CMakeFiles/cache.dir/main.cpp.o -c /root/softwares/SublimeClang/src/main.cpp

      这里清晰地看到了使用的是 /usr/bin/c++ 编译器(后来知道了上面的编译错误和编译器无关),于是我手动编译模拟该错误,确实原样重现了,无论是用 c++ 或者 g++ 都一样,所以有点怀疑是不是因为 18.04 自带的 c++/g++ 版本比较高,或者是系统文件/库有冲突的原因。然后我仔细分析了该编译错误,发现是在模板类定义处

    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:218:39: error: template argument 1 is invalid
     typedef std::vector<shared_ptr<Entry> > EntryList;
                                           ^

    开始出错的,后面的一大堆错误都是因为这里出错导致 EntryList 未定义而引起的,所以只需处理这一句即可。一开始我怀疑是 shared_ptr 缺少了 std:: 的声明,便在该行的前面加上 using namespace std;,重新编译后后还是报同样的错误,然后改成 using std::shared_ptr;,重试还是不行,于是把所有使用到 shared_ptr 的地方都改成 std::shared_ptr,再 make,这次终于成功了,成功编译出 libcache.so 了,真够折腾的。感觉是 c++ 命名空间的问题,shared_ptr 在不同的文件里定义了两次,导致如果不使用 std:: 来引用的话会有问题(using std::shared_ptr 也不行,记得 c++ primer 里有提及到两者的差别),后来重现这个 bug 时发现确实是这样:

    /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:1339:17: error: reference to ‘shared_ptr’ is ambiguous
                     shared_ptr<Entry> entry(new Entry(tmp, representation, insertion));
                     ^~~~~~~~~~
    In file included from /usr/include/c++/7/tr1/memory:50:0,
                     from /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:49:
    /usr/include/c++/7/tr1/shared_ptr.h:501:11: note: candidates are: template<class _Tp> class std::tr1::shared_ptr
         class shared_ptr;
               ^~~~~~~~~~
    In file included from /usr/include/c++/7/bits/shared_ptr.h:52:0,
                     from /usr/include/c++/7/memory:81,
                     from /home/newdawn/.config/sublime-text-3/Packages/SublimeClang/src/main.cpp:31:
    /usr/include/c++/7/bits/shared_ptr_base.h:347:11: note:                 template<class _Tp> class std::shared_ptr
         class shared_ptr;
               ^~~~~~~~~~

      可以看到在 /usr/include/c++/7/tr1/shared_ptr.h:501:11 和 /usr/include/c++/7/bits/shared_ptr_base.h:347:11 处都有 shared_ptr 的定义,应该是 ubuntu18.04 自带的 g++7 的系统库和低版本 g++ 的系统库略有不同,导致 SublimeClang 在低版本的机器上能顺利编译成功,而在这里编译出错。

  • 相关阅读:
    自定义GridView分页控件
    ASP.NET中JSON的序列化和反序列化 C#的JSON数据格式转换方法
    C# 中 Struct 与 Class 的区别,以及两者的适用场合
    IEnumerable
    谈谈C#中的三个关键词new , virtual , override
    常见通信协议
    当base-package="controller.*"时,可见packageSearchPath为"classpath*:controller/*/**/*.class": 当base-package="controller.**"时,可见packageSearchPath为"classpath*:controller/**/**/*.class":
    DO,DTO和VO的使用
    mysql 字符
    mysql sql 分析
  • 原文地址:https://www.cnblogs.com/Newdawn/p/9539022.html
Copyright © 2020-2023  润新知