3.1 cmd编译运行c语言
shift
键,然后右击
,选择在此处打开命令窗口
;建议大家加入-Wall选项,打开常用的警告。
下面是几种常用的命令:
编译c语言
gcc -Wall 源文件名 -o 可执行文件名
编译c++语言
g++ -Wall 源文件名 -o 可执行文件名
调试c++
g++ -g 源文件名 -o 可执行文件名
gdb 可执行文件名
3.2 介绍默认C/C++编译配置文件
把g++加入环境变量后,sublime中默认的编译系统就可以正常使用了。
Sublime Text 3 3080版本之后修改了编译系统,具体设置是
Ctrl+B 执行改格式上次的编译命令:
如果第一次执行则提示选择执行哪个Ctrl+Shift+B 选择执行哪个:
不足之处:
解决办法:
默认的编译配置文件位置:
在Sublime的安装目录的Packages文件夹中,有个文件叫C++.sublime-package:
这个实际上是zip的压缩包,里面包含了c++的默认系统设置,修改后缀名为zip后解压,可以在里面找到C++ Single File.sublime-build文件。
这个文件名就是上面要编译时可以选择的名字,
编译配置文件详解
文件内容如下:
{
"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c, source.c++",
"variants":
[
{
"name": "Run",
"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
}
]
}
这个JSON格式的配置文件就是sublime中build文件的真面目了。花括号里面是一个个的键值对,它们之间用逗号隔开。键和值中间是一个冒号。为了方便下面把键称为名称。
名称和值都要用双引号括起来,因此值里面用到双引号的话,就要用转义 \” (反斜杠+双引号)表示。
这里面用到的名称的含义如下:
上面的配置文件中还有一些类似 ${file} 这种符号,这是sublime提供的变量,一些常用的变量如下:
变量的使用可以直接使用,也可以使用花括号括起来,例如 ${project_name}
我们详细看一下这个文件:
"working\_dir": "${file_path}",
这一行说明工作目录,也就是执行命令时所在的目录,被设置为文件所在的目录。
"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\"",
这就是编译时执行的命令了,它的值的部分是:
执行时,${file}会被替换为编辑的文件名,${file_path}/${file_base_name} 就会被替换为不包含扩展名的完整路径名。它们前后有\”双引号是为了支持带空格的文件名。
假设我们编辑的文件路径为 Z:/cpp/t.cpp ,那么执行时的工作目录就是 Z:/cpp 。${file} 就是 Z:/cpp/t.cpp ,${file_path} 就是 Z:/cpp ,${file_base_name} 就是 t 。我们把转义字符双引号也用双引号表示,这样执行的命令就变成了
g++ "Z:/cpp/t.cpp" -o "Z:/cpp/t"
这正好是编译文件的命令,文件路径前后的双引号保证它支持带空格的路径。编译后生成的可执行文件和源代码文件在一个目录下,名字相同(扩展名不同)。
如果有编译错误,错误信息就会被”file_regex”中的正则表达式匹配并显示。
再来看最后面的代码:
"variants":
[
{
"name": "Run",
"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
}
]
variants的值是一个数组,可以放很多个对象,每个对象表示一个命令。里面name表示了这个命令的名称为Run,也就是运行。编译时选择C++ Single File-Run就会执行这里面的shell_cmd。
运行部分的命令前半部分和编译一样,后面用 && 连接了另一个命令,&&表示编译成功才执行后面的部分。后面为
\"${file_path}/${file_base_name}\"
也就是直接运行可执行文件了。这样是在sublime中捕获运行结果的。看懂这个默认配置文件后,照葫芦画瓢,我们很容易的就可以写出符合自己需要的配置文件。
但是不建议直接修改这个文件,建议大家把用户配置放到用户文件夹下,来代替默认的编译配置。
c语言(Windows 7)
{
"working_dir": "$file_path",
"cmd": "gcc -Wall \"$file_name\" -o \"$file_base_name\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"selector": "source.c",
"variants":
[
{
"name": "Run",
"shell_cmd": "gcc -Wall \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""
}
]
}
和默认相比,就是修改了selector部分为只选择.c文件。Run中的shell_cmd后面部分加上了start cmd /c,start作用是新开一个cmd窗口,cmd表示要执行一个命令行,/c执行完后退出新开的窗口,后面的& pause保证运行结束后窗口不会立即退出。这样Run就会在新的cmd窗口中运行了。
这时候,可以在Tools -> Build System下看到刚才新建的c了:
选中后就可以使用了。
Build System中除了选择具体的编译系统,还可以选择第一个:Automatic 自动选择,会根据打开的文件后缀自动选择。
c语言(Linux)
请参考我的另一篇文章:
Sublime Text 3直接编译执行C/C++程序
C++
gcc虽然可以编译c++代码,但是不能进行c++的连接函数库操作。所以针对c++代码一般使用g++来编译。
方法和上面的c语言的配置一样,只要把配置文件中的gcc改为g++ ,source.c改为source.c++ ,保存文件名c.sublime-build改为c++.sublime-build就可以了。
这里增加了-std=c++11 选项,是按照C++11标准进行编译,不需要的话可以去掉,配置文件如下:
{
"encoding": "utf-8",
"working_dir": "$file_path",
"shell_cmd": "g++ -Wall -std=c++11 \"$file_name\" -o \"$file_base_name\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"selector": "source.c++",
"variants":
[
{
"name": "Run",
"shell_cmd": "g++ -Wall -std=c++11 \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""
}
]
}
实际上,我们可以利用Varians ,来配置多个不同的编译命令。
下面的配置文件有编译 ,编译并在sublime中运行,编译并cmd运行 和 gdb调试 四个命令。
注:gdb调试是打开命令行的方式,这里不支持带空格的源代码文件名和路径,gdb的使用可以参考:gdb调试新手入门(一) | 雅乐网 。 要想通过sublimeGDB插件实现图形化调试,可以参考Sublime Text 3 使用 SublimeGDB 图形化调试c/c++程序。
{
"encoding": "utf-8",
"working_dir": "$file_path",
"shell_cmd": "g++ -Wall -std=c++11 \"$file_name\" -o \"$file_base_name\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"selector": "source.c++",
"variants":
[
{
"name": "Run in sublime",
"shell_cmd": "g++ -Wall -std=c++11 \"$file_name\" -o \"$file_base_name\" && cmd /c \"${file_path}/${file_base_name}\""
},
{
"name": "CMD Run",
"shell_cmd": "g++ -Wall -std=c++11 \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""
},
{
"name": "gdb Debug",
"shell_cmd": "g++ -g -std=c++11 \"$file\" -o \"$file_base_name\" && start cmd /c gdb ${file_path}/${file_base_name} & pause"
}
]
}
sublime可以使用makefile来编译多个文件,以便支持稍大一点的工程项目。(windows下面和linux下面并不相同,本文介绍适用于windows)
这个功能只打开单个文件是没有的,只有打开整个文件夹
侧边栏中可以看到打开的文件夹,确保文件夹中包含makefile文件。此时按下Ctrl+Shift+B ,会有make的选项。
这里make选项执行的是make,但是windows中是没有make这个命令的。MinGW\bin里面的名字是mingw32-make.exe 。解决办法是修改这个文件名改为make.exe ,或者自己新建一个makefile的build文件。
makefile的默认编译配置文件在”C:\Program Files\Sublime Text 3\Packages\Makefile.sublime-package”,解压后的Make.sublime-build文件中。
我们新建一个编译系统,tool –> Build System –> New Build System,内容为
{
"shell_cmd": "mingw32-make",
"file_regex": "^(..[^:\n]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${folder:${project_path:${file_path}}}",
"selector": "source.makefile",
"syntax": "Packages/Makefile/Make Output.sublime-syntax",
"keyfiles": ["Makefile", "makefile"],
"variants":
[
{
"name": "Clean",
"shell_cmd": "mingw32-make clean"
},
{
"name": "Run",
"shell_cmd": "mingw32-make run"
},
]
}
保存为mingw32-make.sublime-build,保存位置和上面c++配置文件位置相同就可以了。
然后打开文件夹后,如果里面有Makefile或makefile文件,就会有对应的命令
由于windows下面常用命令和linux不同,makefile也要做对应的修改:
6 makefile示例
下面是一个简单的示例:
现在有一个test文件夹,里面有4个文件
其中main.cpp用到了function.cpp中的函数。具体代码如下:
main.cpp
#include
#include
#include
#include "function.h"
int main(void)
{
int a = 3, b = 9;
std::cout << add(a, b) << std::endl;
sleep(10);
return 0;
}
function.h
#ifndef _FUNCTION_H_
#define _FUNCTION_H_
int add(int parm1, int parm2);
#endif /* _FUNCTION_H_ */
function.cpp
#include
int add(int parm1, int parm2)
{
return parm1 + parm2;
}
makefile
main: main.cpp function.h function.cpp
clean:
del main.exe *.o
run:
mingw32-make && start cmd /c "main.exe & pause"
注意:makefile里面的clean和run,和我们自己的配置文件里的”variants”下面的命令mingw32-make clean和mingw32-make run对应的。
clean下面使用命令为del而不是linux下面的rm。
另外,由于windows下没有cc命令,这里不能出现全部依赖.o文件的目标。例如不能有这样的规则:
main : main.o function.o
使用这样的规则时,会调用cc,但是windows下面cc没法使用,就会报错。
在sublime text 3中打开该文件夹(注意必须打开文件夹,只打开文件没有make选项)
之后使用Ctrl+shift+B 选择对应的mingw32-make命令即可。
Run对应了编译并运行。
关于Makefile的编写,可以参考我的文章:
(1)makefile的语法及写法
(2)Makefile-例程讲解