配置SublimeText为C/C++的轻量级IDE

Configure SublimeText as a lightweight IDE for C/C++

作为一个cpper,其实早就用惯了GCC这样的工具,不过不得不说啊,GCC的错误信息是真烂啊,虽然有错误提示,但是也经常需要自己肉眼Debug才能搞明白…现在福音来了,Clang的信息精准度不知道比GCC高到哪里去了。

但是Clang在编译C/C++程序的时候 ,后端是MinGW,所以两者都要存在的,这也是正合我意。

2016.04.09-Upgrade

  1. 解决Sublime Text遇到编译错误时会输出系统PATH路径的问题(终于找到根源了)。
  2. 配置Clang++和g++同时编译,且在编译出错时隐藏g++的提示信息(使用1>nul)
  3. 配置gprof来分析代码(这也是上面使用clang和g++同同时编译代码的原因)
  4. 使用SublimeClang进行编码提示和错误提醒

Mingw/+Clang环境配置

首先可以在这里下载Clang(LLVM-3.7.0-win64)MinGW(x86_64-5.2.0-POSIX-SEH-RT_V4-REV1)。

  1. 安装完Clang(LLVM)之后添加至系统环境变量(PATH路径)。
  2. 安装WinGW.
  3. \MinGW\bin\MinGW\x86_64-w64-mingw32\include添加至系统环境变量(PATH路径)
  4. 注销/重启之后可试一下:clang -vgcc/g++ -v,如下图才对。


现在我们可以先试一下。
先祭上代码:

1
2
3
4
5
6
7
#include <iostream>
using namespace std;
int main(void)
{
cout<<"HelloWorld"<<endl;
return 0;
}

横向对比Clang和GCC

先用Clang++试下:

然后故意删掉一个;试试,为了对比我也用g++编译一下:

额,我宣布G++完败。

再来试个代码量稍微多一点的:
Clang:

G++:

啊,让我冷静一下,真是回不去的体验。

下面进入第二部分:

配置Sublime Text使用clang编译代码

其实之前一直都用sublime默认的build系统来编译代码,但是升级到Sublime Text 3之后出现了很多奇怪的问题,比如下面就是我最难忍的已解决):

解决方案:
1 找到sublime Text3安装路径下的Default.sublime-package,如~Sublime Text 3\Packages\Default.sublime-package
2 解压Default.sublime-package包(改下后缀名为zip或rar即可解压),并提取其中的exec.py文件
3 将该exec.py文件放到C:\Users{UserName}\AppData\Roaming\Sublime Text 3\Packages 路径下
4 修改exec.py文件,将文件中的
self.append_string(proc, self.debug_text)
注释掉
5 重启Sublime Text,即可解决。


当编译错误时会遍历出出系统的PATH路径,重写了多次build规则无果之后,我选择狗带,忍了。但是,一直忍哪是我的Style,趁着今天折腾Clang的当口,再来折腾一下。
其实Sublime Text 3中C/C++默认的构建系统也是无比弱鸡的,程序输出会捕获到Sublime Text的窗口中,这样导致不能运行时输入信息的,遇到scanf/cin就挂了。所以,大部分的处理办法是使用默认的编译系统编译代码和捕获错误信息,如果编译成功使用cmd运行可执行文件。
所以这个球又踢回来了,我不想让他在sublime Text窗口显示错误(其实是错误爆出的PATH信息),我要让它使用一个cmd窗口显示编译/错误信息,一个窗口运行程序。
想法有了,本着不重复造轮子的心态我去Google了一下,貌似没人提到过这个问题,还是自己造个轮子吧。
Google到了一份关于Sublime Text构建系统的文档,除却基本语法外,构建系统变量这东西最重要:

构建系统变量 含义
$file_path 当前文件目录,比如,C:Files.
$file 当前文件完整路径,比如,C:FilesChapter1.txt.
$file_name 当前文件的完整文件名,比如,Chapter1.txt.
$file_extension 当前文件的扩展名,比如,txt.
$file_base_name 当前文件的名称,比如,Document.
$packages Packages目录的完整路径。
$project 当前project文件完整路径.
$project_path 当前porject文件所在的完整目录。
$project_name project文件的完整文件名。
$project_extension 当前project文件的扩展名。
$project_base_name 当前project文件的基本文件名。

更多的资料点这里——Sublime Text构建系统

现在有了Sublime构建系统变量名还有基本语法,按照以上的思路,要实现一键启动两个终端实现编译/运行的效果首先我们要解决以下几个问题:

  1. 按下Ctrl+B之后,构建系统cd到源文件所在目录
  2. 在此目录下使用clang编译源文件
  3. 编译完成之后启动程序(一定要编译完成之后,因为如果没有编译或者编译出错后面是没有程序可运行的)

其实前两步还好说,可以使用&把两个语句连起来。
手动效果就是这样的:
cd C:\Users\visionsmile\Desktop & clang++ -o test.exe test.cc -std=c++11 -w
所以我在上面说构建系统变量最重要啊。
使用构建系统变量之后,可以写成这样:
cd $file_path & clang++ -o $file_base_name.exe $file_name -std=c++11 -w
再按照语法整理一下(按下Ctrl+B之后启动一个新窗口用来编译代码):
"cmd": ["start", "cmd", "/k", "cd", "$file_path", "&", "clang++", "-o", "${file_base_name}.exe", "${file_name}", "-std=c++11"]
期间折腾的不少,这里省略了。思路就是这样的。

说说遇到的问题:没想到怎么使用构建系统的语法判断编译成功了没有,所以,如果编译和运行写在一起如果编译中遇到错误,负责执行的窗口也是会执行的,不过因为没有编译成功可执行文件,会报错的,强迫症怎么能忍,我选了个折衷的方案:

通过选择,执行哪一个方案,第一个是编译第二个是启动程序。

下面贴上整个配置(已更新):

Build——是使用Clang++和g++同时编译
Build - RUN——运行Clang++编译的版本
Build - G++——运行G++编译的版本
Build - G++ Profiler——分析代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
"cmd": ["clang++", "-o", "${file_path}/${file_base_name}_clangxx.exe", "${file}", "-std=c++11", "-w","&","g++", "-o", "${file_path}/${file_base_name}_gxx.exe","${file}", "-std=c++11", "-w", "-pg","2>nul"],
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++",
"shell": true,
"variants":
[
{
"name": "Run",
"cmd": ["start","console_runner", "${file_path}/${file_base_name}_clangxx.exe"]
},
{
"name": "G++ Run",
"cmd": ["start","console_runner", "${file_path}/${file_base_name}_gxx.exe"]
},
{
"name": "G++ Profiler",
"cmd": ["gprof","-b", "${file_base_name}_gxx.exe","gmon.out",">","${file_base_name}_prof.txt", "&", "C:\\Program Files\\SystemTools\\Sublime Text 3\\sublime_text.exe", "${file_base_name}_prof.txt"]
}
]
}

测试截图:
有错误时编译:

修复错误,编译成功后运行:

使用SublimeClang进行代码提示

网上已经有很多教程了,不过很多都是基于4.X的win32的MinGW,在我使用这个版本Mingw(gcc version 5.2.0 (x86_64-posix-seh-rev1)库的路径是和4.X的不一样的,下面直接扔上我的配置文件吧。
另:SublimeClang可以在这里下载。
注意:所附链接的SublimeClang必须使用32bit的SublimeText,64bit的无法使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
"show_output_panel": false,
"dont_prepend_clang_includes": true,
"inhibit_sublime_completions": false,
"hide_output_when_empty": true,
"show_visual_error_marks": true,
"options":
[
"-m32",
//"-w",
"-ferror-limit=9",
"-fgnu-runtime",
"-fms-extensions",
"-nostdinc",
// "-std=c++11",
"-std=gnu++11",
// "-std=g++11",
// 此处填写自己pc中的实际位置和版本号.
"-isystem", "C:\\Program Files\\CompileBuild\\MinGW\\x86_64-w64-mingw32\\include",
"-isystem", "C:\\Program Files\\CompileBuild\\MinGW\\x86_64-w64-mingw32\\include\\c++",
"-isystem", "C:\\Program Files\\CompileBuild\\MinGW\\lib\\gcc\\x86_64-w64-mingw32\\5.2.0\\include",
"-isystem", "C:\\Program Files\\CompileBuild\\MinGW\\x86_64-w64-mingw32\\include\\c++\\x86_64-w64-mingw32",
"-isystem", "C:\\Program Files\\CompileBuild\\MinGW\\include",
"-isystem", "C:\\Program Files\\CompileBuild\\MinGW\\lib\\gcc\\x86_64-w64-mingw32\\5.2.0\\include",
"-D__GNUC__=4",
"-D__GNUC_MINOR__=2",
"-D__GNUC_PATCHLEVEL__=1",
"-D__GXX_ABI_VERSION__=1002",
"-Di386=1",
"-D__i386=1",
"-D__i386__=1",
"-DWIN32=1",
"-D_WIN32=1",
"-D__WIN32=1",
"-D__WIN32__=1",
"-DWINNT=1",
"-D__WINNT=1",
"-D__WINNT__=1",
"-D_X86_=1",
"-D__MSVCRT__=1",
"-D__MINGW32__=1",
"-D__STDC_VERSION__=201112L"
],
}

后记
其实这个是没什么技术含量的,这里写下来主要是想提醒自己,多看文档多看文档多看文档,比不明所以地Google或自己埋头造轮子强的太多了。

我的配置文件可以在这里下载:SublimeText

全文完,若有不足之处请评论指正。

微信扫描二维码,关注我的公众号。

本文标题:配置SublimeText为C/C++的轻量级IDE
文章作者:查利鹏
发布时间:2015/12/26 21:54
更新时间:2017/04/10 18:18
本文字数:3.2k 字
原始链接:https://imzlp.com/posts/14596/
许可协议: CC BY-NC-SA 4.0
文章禁止全文转载,摘要转发请保留原文链接及作者信息,谢谢!
您的捐赠将鼓励我继续创作!