sublime text 3配置c/c++編譯環境

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++

關於gcc和g++

安裝編譯器是後面全部工做的基礎,若是沒有編譯器,後面的一切都無從談起。在windows下使用gcc和g++,是經過安裝MinGW實現的。正則表達式

安裝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盤根目錄

sublime text 3配置c/c++編譯環境 1

在cmd中使用gcc

假設咱們有一個test.c文件在Z盤的work目錄下。首先咱們要在cmd中進入此目錄。方法能夠是在work目錄空白處按住Shift點擊鼠標右鍵,選擇「在此處打開命令窗口」;也能夠使用cd命令進入。

sublime text 3配置c/c++編譯環境 2

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裏運行了。

sublime text 3配置c/c++編譯環境 3

配置環境變量

爲了方便,通常咱們會把gcc所在的路徑加入系統的環境變量,這樣就能夠直接使用gcc命令而不用絕對路徑。

右鍵計算機->屬性->高級系統設置->環境變量

sublime text 3配置c/c++編譯環境 4

在path的值中,能夠發現有一些目錄,他們之間用英文的分號分隔。咱們雙擊path,把咱們gcc的路徑  C:\MinGW\bin  添加進去。   要注意先後的英文分號。

sublime text 3配置c/c++編譯環境 5

肯定之後 就能夠在任意目錄下直接使用gcc命令了。能夠在任意目錄打開cmd窗口,輸入gcc查看環境變量是否設置成功。若是仍然提示不是內部或外部命令,說明環境變量設置失敗。

sublime text 3配置c/c++編譯環境 6

注意:在sublime text 3 build 3083中,環境變量的修改不會當即在sublime中生效,須要重啓windows。

cmd編譯運行c語言

總結一下流程:

首先咱們要在cmd中進入.c文件所在的目錄做爲工做目錄

而後執行gcc source.c -o dest來生成可執行文件

最後輸入生成的可執行文件名來運行生成的程序。

建議你們加入-Wall選項,打開經常使用的警告。

下面是幾種經常使用的命令:

編譯c語言

gcc -Wall 源文件名 -o 可執行文件名

1

gcc -Wall 源文件名 -o 可執行文件名

編譯c++語言

g++ -Wall 源文件名 -o 可執行文件名

1

g++ -Wall 源文件名 -o 可執行文件名

 

Sublime Text 3默認c/c++編譯系統的不足

編譯系統

把g++加入環境變量後,sublime中默認的編譯系統就能夠正常使用了。

咱們在Sublime Text 3中打開一個cpp文件,按Ctrl+B

sublime text 3配置c/c++編譯環境 7

這是sublime自帶的默認c++編譯命令。第一個是編譯,第二個是運行。這時候是能夠正常使用的。(環境變量配置後需重啓windows

sublime text 3配置c/c++編譯環境 8

Sublime Text 3 3080版本以後修改了編譯系統,具體設置是

Ctrl+B 執行改格式上次的編譯命令。若是第一次執行則提示選擇執行哪一個

Ctrl+Shift+B 選擇執行哪一個

不足之處:

1. 程序輸出捕獲到Sublime窗口中,這樣致使不能運行時輸入信息。執行含有scanf語句的代碼會卡住。

2. 默認狀況下c和c++沒有進行區分,所有當作c++格式來處理了。

解決辦法

第一個是設置在新的cmd窗口執行程序,這樣就能夠輸入信息。

第二個是針對c語言單獨寫一個build配置文件。

默認的編譯配置文件在哪

在Sublime的安裝目錄的Packages文件夾中,有個文件叫C++.sublime-package

sublime text 3配置c/c++編譯環境 9

這個其實是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++都選擇的。

咱們只要略做修改,就能夠實現咱們的須要了。

可是這是系統的配置,並不建議修改。建議你們把用戶配置放到用戶文件夾下,來代替默認的編譯配置。

新建編譯系統

c語言

選擇tool –> Build System –> New Build System

sublime text 3配置c/c++編譯環境 10

而後輸入如下代碼

{ "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,保存在此目錄。

sublime text 3配置c/c++編譯環境 11

這時候,能夠在Tools -> Build System下看到剛纔新建的c了

sublime text 3配置c/c++編譯環境 12

選中後就可使用了。

Build System中除了選擇具體的編譯系統,還能夠選擇第一個:Automatic 自動選擇,會根據打開的文件後綴自動選擇。因爲默認狀況下.c文件sublime識別爲c++類型,因此使用自動選擇的時候還須要修改一點:

先用sublime打開.c文件的時候 默認是c++格式 。(注:最新的3013版本已經默認是c格式,則沒必要修改)

sublime text 3配置c/c++編譯環境 13

點擊紅色箭頭處的c++  選擇Open all with current extension as .. 而後選擇C

sublime text 3配置c/c++編譯環境 14

這樣之後打開.c文件就默認是c類型

這時候按Ctrl+Shift+B

sublime text 3配置c/c++編譯環境 15

第三個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等函數進行輸入了。

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\"" } ] }

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運行三種

sublime text 3配置c/c++編譯環境 16

{ "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 。因此代碼中出現中文時運行會亂碼。

解決思路也很簡單,就是讓他們編碼一致就能夠了。

1. 修改cmd編碼爲utf-8

使用chcp命令能夠查看當前字符集,默認是936 ,可使用chcp 65001修改字符集爲utf-8

然而彷佛只對當前打開的窗口有效,一個麻煩的辦法是每次代碼裏運行system來切換字符集(噗)

2. 修改源代碼格式爲GBK

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編碼兩種狀況下中文都不會亂碼的方法。。。

使用makefile編譯多個文件

sublime可使用makefile來編譯多個文件,以便支持稍大一點的工程項目。只要在側邊欄中打開相關的文件夾,確保文件夾中包含makefile文件。此時按下Ctrl+Shift+B ,會有make的選項,點擊執行就能夠了。

sublime text 3配置c/c++編譯環境 17

sublime-build編譯系統配置文件

這個編譯文件是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}

相關文章
相關標籤/搜索