sublime text 3提供了構建功能,它的構建系統(Build systems)能夠運行一段外部命令,還能夠捕獲輸出並顯示。html
要在sublime text 3中實現c或c++代碼的編譯和運行,在本質上說也是調用外部的命令,windows中也能夠理解爲執行一段cmd命令。linux
目前c/c++編譯器最流行的就是gcc和g++,本文將先介紹gcc和g++的基本命令格式,而後介紹win7 64bit下 Sublime Text 3 build 3083版本中build配置文件的編寫。c++
安裝編譯器是後面全部工做的基礎,若是沒有編譯器,後面的一切都無從談起。在windows下使用gcc和g++,是經過安裝MinGW實現的。正則表達式
MinGW是Minimalist GNU on Windows的首字母縮寫,安裝後就可使用不少的GNU工具。GNU(GNU’s Not Unix)是linux中的一個著名的項目,包含了gcc\g++\gdb等工具。也就是說,安裝MinGw後,咱們就可使用gcc和g++命令了。shell
MinGW的官網是 http://www.mingw.org/ ,可是從官網安裝很麻煩,在線安裝常常龜速容易失敗。windows
雅樂網推薦的方法是藉助codeblocks,選擇帶有mingw的版本安裝,安裝後把mingw文件夾複製出來就能夠了。函數
這裏提供瞭解壓版的MinGW,是使用 codeblocks-13.12mingw-setup 安裝後複製出來的:工具
http://pan.baidu.com/s/1gd5YzVPui
解壓後,能夠在 MinGW/bin 目錄下找到咱們須要的gcc.exe和g++.exe 。編碼
我這裏把MinGW文件夾放到c盤根目錄
假設咱們有一個test.c文件在Z盤的work目錄下。首先咱們要在cmd中進入此目錄。方法能夠是在work目錄空白處按住Shift點擊鼠標右鍵,選擇「在此處打開命令窗口」;也能夠使用cd命令進入。
gcc的通常格式是
gcc 源文件名 -o 可執行文件名
1 |
gcc 源文件名 -o 可執行文件名 |
可是咱們輸入命令
gcc test.c -o test
1 |
gcc test.c -o test |
執行後卻提示
‘gcc’ 不是內部或外部命令,也不是可運行的程序或批處理文件。
這是由於命令執行時,會在當前目錄下查找名爲gcc的可執行文件,若是查不到就在系統環境變量path記錄的路徑裏尋找gcc可執行文件。可是目前這兩個地方都沒有。咱們的gcc文件所在的目錄是c盤下的MinGW/bin。
這時可使用絕對路徑來調用gcc可執行文件
Z:\work>c:/MinGW/bin/gcc test.c -o test Z:\work>test.exe hello world
1 2 3 4 |
Z:\work>c:/MinGW/bin/gcc test.c -o test
Z:\work>test.exe hello world |
這樣就成功編譯生成了可執行文件test.exe,而後就能夠在cmd裏運行了。
爲了方便,通常咱們會把gcc所在的路徑加入系統的環境變量,這樣就能夠直接使用gcc命令而不用絕對路徑。
右鍵計算機->屬性->高級系統設置->環境變量
在path的值中,能夠發現有一些目錄,他們之間用英文的分號分隔。咱們雙擊path,把咱們gcc的路徑 C:\MinGW\bin 添加進去。 要注意先後的英文分號。
肯定之後 就能夠在任意目錄下直接使用gcc命令了。能夠在任意目錄打開cmd窗口,輸入gcc查看環境變量是否設置成功。若是仍然提示不是內部或外部命令,說明環境變量設置失敗。
注意:在sublime text 3 build 3083中,環境變量的修改不會當即在sublime中生效,須要重啓windows。
總結一下流程:
首先咱們要在cmd中進入.c文件所在的目錄做爲工做目錄
而後執行gcc source.c -o dest來生成可執行文件
最後輸入生成的可執行文件名來運行生成的程序。
建議你們加入-Wall選項,打開經常使用的警告。
下面是幾種經常使用的命令:
編譯c語言
gcc -Wall 源文件名 -o 可執行文件名
1 |
gcc -Wall 源文件名 -o 可執行文件名 |
編譯c++語言
g++ -Wall 源文件名 -o 可執行文件名
1 |
g++ -Wall 源文件名 -o 可執行文件名 |
把g++加入環境變量後,sublime中默認的編譯系統就能夠正常使用了。
咱們在Sublime Text 3中打開一個cpp文件,按Ctrl+B
這是sublime自帶的默認c++編譯命令。第一個是編譯,第二個是運行。這時候是能夠正常使用的。(環境變量配置後需重啓windows)
Sublime Text 3 3080版本以後修改了編譯系統,具體設置是
Ctrl+B 執行改格式上次的編譯命令。若是第一次執行則提示選擇執行哪一個
Ctrl+Shift+B 選擇執行哪一個
1. 程序輸出捕獲到Sublime窗口中,這樣致使不能運行時輸入信息。執行含有scanf語句的代碼會卡住。
2. 默認狀況下c和c++沒有進行區分,所有當作c++格式來處理了。
解決辦法
第一個是設置在新的cmd窗口執行程序,這樣就能夠輸入信息。
第二個是針對c語言單獨寫一個build配置文件。
在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}\"" } ] }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "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格式的配置文件,能夠看到 selector部分確實是c和c++都選擇的。
咱們只要略做修改,就能夠實現咱們的須要了。
可是這是系統的配置,並不建議修改。建議你們把用戶配置放到用戶文件夾下,來代替默認的編譯配置。
選擇tool –> Build System –> New Build System
而後輸入如下代碼
{ "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\"" } ] }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "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\"" } ] } |
按Ctrl+s保存,會自動打開user目錄(Sublime Text 3\Packages\User),咱們修改 文件名爲 c.sublime-build,保存在此目錄。
這時候,能夠在Tools -> Build System下看到剛纔新建的c了
選中後就可使用了。
Build System中除了選擇具體的編譯系統,還能夠選擇第一個:Automatic 自動選擇,會根據打開的文件後綴自動選擇。因爲默認狀況下.c文件sublime識別爲c++類型,因此使用自動選擇的時候還須要修改一點:
先用sublime打開.c文件的時候 默認是c++格式 。(注:最新的3013版本已經默認是c格式,則沒必要修改)
點擊紅色箭頭處的c++ 選擇Open all with current extension as .. 而後選擇C
這樣之後打開.c文件就默認是c類型
這時候按Ctrl+Shift+B
第三個c就是對應執行配置文件中的第三行 gcc -Wall $file_name -o $file_base_name 做用是編譯。
第四個c-Run對應後面的命令 gcc -Wall $file -o $file_base_name && start cmd /c \」${file_path}/${file_base_name} & pause\」 ,做用是是在新的cmd窗口運行。這樣就能夠對scanf等函數進行輸入了。
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\"" } ] }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "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\"" } ] } |
這個配置文件編譯的時候也會運行 g++ -Wall -std=c++0x $file_name -o $file_base_name && cmd /c ${file_path}/${file_base_name} ,若是隻想編譯,能夠把&&後面去掉就能夠了。
實際上,咱們能夠利用Varians ,來配置多個不一樣的編譯命令。例以下面的配置文件有編譯 ,捕獲輸出運行,cmd運行三種
{ "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\"" } ] }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "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\"" } ] } |
感謝RGB0x000000同學指出關於中文編碼的問題。因爲Sublime Text 3中文件默認編碼格式是utf-8 ,而windows中的命令行默認編碼格式是GBK 。因此代碼中出現中文時運行會亂碼。
解決思路也很簡單,就是讓他們編碼一致就能夠了。
使用chcp命令能夠查看當前字符集,默認是936 ,可使用chcp 65001修改字符集爲utf-8
然而彷佛只對當前打開的窗口有效,一個麻煩的辦法是每次代碼裏運行system來切換字符集(噗)
Sublime原生並不支持GBK編碼,但若是安裝了ConvertToUTF8插件,就能夠正確顯示ANSI或者GBK編碼的文件。所以,裝插件後打開GBK編碼的源代碼文件,也不會亂碼。
一個更巧妙地辦法是使用編譯器的選項 -fexec-charset 來設置代碼中字符串的編碼,這樣源文件可使用utf-8編碼,只是編譯的時候用指定的編碼來編譯源代碼中的字符串。
在編譯命令gcc中加入選項 -fexec-charset=GBK 來講明將代碼中的字符串按照GBK編碼,從而和CMD窗口一致,也不會亂碼。
修改後的c語言的配置文件以下:
{ "working_dir": "$file_path", "cmd": "gcc -Wall -fexec-charset=GBK \"$file_name\" -o \"$file_base_name\"", "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", "selector": "source.c", "variants": [ { "name": "Run", "shell_cmd": "gcc -Wall -fexec-charset=GBK \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\"" } ] }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "working_dir": "$file_path", "cmd": "gcc -Wall -fexec-charset=GBK \"$file_name\" -o \"$file_base_name\"", "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", "selector": "source.c", "variants": [ { "name": "Run", "shell_cmd": "gcc -Wall -fexec-charset=GBK \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\"" } ] } |
可是加入這個選項後,若是要編譯的不是utf-8 ,而是GBK ,必須還要加入-finput-charset=GBK 選項來制定源代碼的編碼格式,不然會提示錯誤
error: converting to execution character set: Illegal byte sequence。
而加入這個選項後編譯utf-8又會亂碼。。。因此,目前博主還沒找到源文件是utf-8編碼和gbk編碼兩種狀況下中文都不會亂碼的方法。。。
sublime可使用makefile來編譯多個文件,以便支持稍大一點的工程項目。只要在側邊欄中打開相關的文件夾,確保文件夾中包含makefile文件。此時按下Ctrl+Shift+B ,會有make的選項,點擊執行就能夠了。
這個編譯文件是JSON文件,遵循JSON的語法。JSON 數據的書寫格式是:
「名稱」: 「值」 例如 「firstName」 : 「John」
值中若是還有雙引號要用轉義 \」 來表示
名稱 | 含義 |
---|---|
working_dir | 運行cmd是會先切換到working_dir指定的工做目錄 |
cmd | 包括命令及其參數。若是不指定絕對路徑,外部程序會在你係統的:const:PATH 環境變量中搜索。 |
shell_cmd | 至關於shell:true的cmd ,cmd能夠經過shell運行。 |
file_regex | 該選項用Perl的正則表達式來捕獲構建系統的錯誤輸出到sublime的窗口。 |
selector | 在選定 Tools | Build System | Automatic 時根據這個自動選擇編譯系統。 |
variants | 用來替代主構建系統的備選。例如Run命令。會顯示在tool的命令中。 |
name | 只在variants下面有,設置命令的名稱,例如Run。 |
只列舉了用到的:
變量 | 含義 |
---|---|
$file_path | 當前文件所在目錄路徑, e.g., C:\Files. |
$file | 當前文件的詳細路徑, e.g., C:\Files\Chapter1.txt. |
$file_name | 文件全名(含擴展名), e.g., Chapter1.txt. |
$file_extension | 當前文件擴展名, e.g., txt. |
$file_base_name | 當前文件名(不包括擴展名), e.g., Document. |
變量的使用能夠直接使用,也可使用花括號括起來,例如 ${project_name}
還可使用:設置默認值 ${project_name:Default}