作为一个cpper,其实早就用惯了GCC这样的工具,不过不得不说啊,GCC的错误信息是真烂啊,虽然有错误提示,但是也经常需要自己肉眼Debug才能搞明白…现在福音来了,Clang
的信息精准度不知道比GCC高到哪里去了。
但是Clang在编译C/C++程序的时候 ,后端是MinGW,所以两者都要存在的,这也是正合我意。
2016.04.09-Upgrade
- 解决Sublime Text遇到编译错误时会输出系统PATH路径的问题(终于找到根源了)。
- 配置Clang++和g++同时编译,且在编译出错时隐藏g++的提示信息(使用
1>nul
) - 配置gprof来分析代码(这也是上面使用clang和g++同同时编译代码的原因)
- 使用SublimeClang进行编码提示和错误提醒
Mingw/+Clang环境配置
首先可以在这里下载Clang(LLVM-3.7.0-win64)和MinGW(x86_64-5.2.0-POSIX-SEH-RT_V4-REV1)。
- 安装完Clang(LLVM)之后添加至系统环境变量(PATH路径)。
- 安装WinGW.
- 将
\MinGW\bin
和\MinGW\x86_64-w64-mingw32\include
添加至系统环境变量(PATH路径) - 注销/重启之后可试一下:
clang -v
和gcc/g++ -v
,如下图才对。
现在我们可以先试一下。
先祭上代码:
1 | #include <iostream> |
横向对比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构建系统变量名还有基本语法,按照以上的思路,要实现一键启动两个终端实现编译/运行的效果首先我们要解决以下几个问题:
- 按下Ctrl+B之后,构建系统cd到源文件所在目录
- 在此目录下使用clang编译源文件
- 编译完成之后启动程序(一定要编译完成之后,因为如果没有编译或者编译出错后面是没有程序可运行的)
其实前两步还好说,可以使用&把两个语句连起来。
手动效果就是这样的: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 | { |
测试截图:
有错误时编译:
修复错误,编译成功后运行:
使用SublimeClang进行代码提示
网上已经有很多教程了,不过很多都是基于4.X的win32的MinGW,在我使用这个版本Mingw(gcc version 5.2.0 (x86_64-posix-seh-rev1)库的路径是和4.X的不一样的,下面直接扔上我的配置文件吧。
另:SublimeClang可以在这里下载。
注意:所附链接的SublimeClang必须使用32bit的SublimeText,64bit的无法使用。
1 | { |
后记
其实这个是没什么技术含量的,这里写下来主要是想提醒自己,多看文档多看文档多看文档,比不明所以地Google或自己埋头造轮子强的太多了。
我的配置文件可以在这里下载:SublimeText