原文地址: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-/Packages/SublimeClang/src/build$ make
Scanning dependencies of target cache
[ %] Building CXX object CMakeFiles/cache.dir/main.cpp.o
/home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::: error: template argument is invalid
typedef std::vector<shared_ptr<Entry> > EntryList;
^
/home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::: error: template argument is invalid
/home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp: In function ‘void trim(EntryList&)’:
/home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::: error: qualified-id in declaration before ‘i’
EntryList::iterator i = mEntries.begin();
^
/home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::: error: ‘i’ was not declared in this scope
while (i != mEntries.end() && (*i)->display[] == '\t')
^
/home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::: error: request for member ‘end’ in ‘mEntries’, which is of non-class type ‘EntryList {aka int}’
while (i != mEntries.end() && (*i)->display[] == '\t')
^~~
/home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::: error: request for member ‘erase’ in ‘mEntries’, which is of non-class type ‘EntryList {aka int}’
mEntries.erase(i);
^~~~~
/home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::: error: request for member ‘begin’ in ‘mEntries’, which is of non-class type ‘EntryList {aka int}’
i = mEntries.begin();
^~~~~
/home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::: 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-/Packages/SublimeClang/src/main.cpp::: error: template argument  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-/Packages/SublimeClang/src/main.cpp::: error: reference to ‘shared_ptr’ is ambiguous
shared_ptr<Entry> entry(new Entry(tmp, representation, insertion));
^~~~~~~~~~
In file included from /usr/include/c++//tr1/memory::,
from /home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::
/usr/include/c++//tr1/shared_ptr.h::: note: candidates are: template<class _Tp> class std::tr1::shared_ptr
class shared_ptr;
^~~~~~~~~~
In file included from /usr/include/c++//bits/shared_ptr.h::,
from /usr/include/c++//memory:,
from /home/newdawn/.config/sublime-text-/Packages/SublimeClang/src/main.cpp::
/usr/include/c++//bits/shared_ptr_base.h::: 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 在低版本的机器上能顺利编译成功,而在这里编译出错。

[转] ubuntu安装Sublime Text 3并使用SublimeClang插件的更多相关文章

  1. Ubuntu安装sublime Text 3并配置可以输入中文

    使用Ubuntu系统后,想找一个顺手的编辑器,sublime作为我的首选编辑器,在安装和配置可输入中文时遇到各种个样的问题,总结一些: 1:问题: 我的系统是Ubuntu 18.04 LTS,尝试多次 ...

  2. Ubuntu安装Sublime Text并输入中文

    Sumblime Text3是一款传说中的神级代码编辑器,具有下面特点: 1.代码高亮,自己主动补全 2.各种插件扩展 3.外观简洁舒适 4.跨平台(Windows,Linux,OS X) 简而言之就 ...

  3. [笔记]--Ubuntu安装Sublime Text 2

    sublime text 2 有两种安装方式,一种是添加软件源,然后用命令安装.另外一种是下载安装包.解压手动安装.Sublime Text 2 入门及技巧 一.下载安装 1.在Sublime Tex ...

  4. ubuntu下安装 Sublime Text 3 及 PlantUML 绘图插件

    ubuntu下只想做C++的程序代码编写,最开始选择了codeblock,主要目的是安装简单,集成度高,还可以调试,但是用的时候老是无故退出,改了半天的代码就这样丢失,挺苦恼的,可能跟自己装的系统比较 ...

  5. Ubuntu安装 Sublime Text 及常用插件推荐

    之前一直在用 Code Blocks 这个IDE工具,可用着还是感觉不怎么好,于是在网上找到了一篇文章,上面介绍了不少IDE,我找到了Sublime Text 感觉挺不错的. 帖子地址: http:/ ...

  6. Ubuntu安装Sublime Text 2

    参考资料:http://www.technoreply.com/how-to-install-sublime-text-2-on-ubuntu-12-04-unity/ 1.去Sublime Text ...

  7. Ubuntu安装Sublime Text 3

    终端命令行安装: Install the GPG key: wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo a ...

  8. 在 Sublime Text 3 中使用 SublimeClang 插件

    SublimeClang 是 Sublime Text 中唯一的 C/C++ 自动补全插件,功能强大,自带语法检查功能,可惜目前作者停止更新了,而且只支持 Sublime Text 2.今晚在 ST ...

  9. Ubuntu 14.04 安装 Sublime Text 3

    1. 实验环境 Ubuntu 14.04 + Sublime text 3 2. sublime text介绍 ublime Text 是一款流行的文本编辑器软件,有点类似于TextMate,跨平台, ...

随机推荐

  1. 关于如何以编程的方式执行TestNG

    1.如果需要加入一个一个的类 public static void main(String args[]){ TestNG tng = new TestNG(); tng.SetTestClasses ...

  2. 组队打代码 !!! ——Alpha项目冲刺

    Alpha阶段 - 博客链接合集 队伍名称: 代码那些事儿 学号 姓名 211606320 刘佳 211606313 李佳 211606303 陈水莲 211606302 曾丽丽 211606338 ...

  3. 吴裕雄 实战python编程(2)

    from urllib.parse import urlparse url = 'http://www.pm25x.com/city/beijing.htm'o = urlparse(url)prin ...

  4. python复制文件,路径不存在问题(Windows和linux路径分隔符不统一)

    问题: python脚本涉及到复制文件,而我们需要兼容Windows.linux和mac环境 (Windows和linux的路径分隔符不同:通过os.path.sep查看分隔符)   如果用[路径名+ ...

  5. Node.js的知识点框架整理

    背景:因为appium是基于Node.js的,所以想看一下Node.js.但是发现很多资料的顺序看起来有点颠倒.然后就一面看资料一面整理了一下大概的知识点框架,希望对自己对别人有用. 本文不包含nod ...

  6. SpringCloud 简单理解

    0.SpringCloud,微服务架构.包括 服务发现(Eureka),断路器(Hystrix),服务网关(Zuul),客户端负载均衡(Ribbon).服务跟踪(Sleuth).消息总线(Bus).消 ...

  7. Infinity,NaN

    常量 说明 Infinity 表示正无穷大的特殊值. -Infinity 表示负无穷大的特殊值. NaN Number 数据类型的一个特殊成员,用来表示“非数字”(NaN) 值. undefined ...

  8. docker在centos和Ubuntu的安装

    CentOS: http://blog.csdn.net/wuapeng/article/details/51728614 rpm -Uvh http://www.elrepo.org/elrepo- ...

  9. php中错误处理机制

    php中,异常处理机制是有限的,无法自动抛出异常,必须手动进行,并且内置异常有限. php把许多异常看作错误,这样就可以把这些异常想错误一样用set_error_handler接管,进而主动抛出异常. ...

  10. DataTable的序列化和反序列化

    /// <summary> /// DataTable序列化 /// </summary> /// <param name="dt"></ ...